如何在WooCommerce购物车及结算页添加体积总计自定义行
在WooCommerce购物车和结算页添加总体积总计行
Hey James, 恭喜你已经搞定了自定义体积字段和产品页展示的部分!要实现购物车/结算页的总体积累加和总计行,咱们可以利用WooCommerce的核心钩子来完成,下面是具体的实现步骤和代码:
1. 确保自定义体积值被存入购物车项
首先得把产品的体积数据带到购物车项里,这样后续才能计算。假设你的自定义字段键是_product_volume(如果不是,记得替换成你实际的字段名),用woocommerce_add_cart_item_data钩子来存储:
// 将产品体积存入购物车项数据 add_filter('woocommerce_add_cart_item_data', 'save_product_volume_to_cart', 10, 3); function save_product_volume_to_cart($cart_item_data, $product_id, $variation_id) { // 获取产品的自定义体积值 $product_volume = get_post_meta($product_id, '_product_volume', true); if (!empty($product_volume) && is_numeric($product_volume)) { // 把体积存入购物车项,加上唯一键避免重复添加时覆盖 $cart_item_data['product_volume'] = floatval($product_volume); $cart_item_data['unique_key'] = md5(microtime().rand()); } return $cart_item_data; }
2. (可选)在购物车商品行显示单个商品体积
如果想让用户看到每个商品的体积,可以用woocommerce_cart_item_meta钩子添加到商品元信息里:
// 在购物车商品行显示单个商品体积 add_action('woocommerce_cart_item_meta', 'display_single_product_volume_in_cart', 10, 3); function display_single_product_volume_in_cart($item_meta, $cart_item, $cart_item_key) { if (isset($cart_item['product_volume'])) { $item_meta .= '<br><small>体积: ' . wc_format_decimal($cart_item['product_volume'], 3) . ' m³</small>'; } return $item_meta; }
3. 计算总体积并添加总计行
接下来是核心部分:计算所有购物车商品的总体积(要乘以购买数量),然后在购物车和结算页的订单总计区域添加一行显示总体积。
计算总体积的辅助函数
先写一个通用函数来计算总体积:
// 计算购物车商品总体积 function calculate_cart_total_volume() { $total_volume = 0; foreach (WC()->cart->get_cart() as $cart_item) { if (isset($cart_item['product_volume'])) { // 单个商品体积 × 购买数量 $total_volume += floatval($cart_item['product_volume']) * intval($cart_item['quantity']); } } return $total_volume; }
在购物车页添加总计行
用woocommerce_cart_totals_after_order_total钩子把总计行加到购物车页的订单总计区域:
// 在购物车页添加总体积总计行 add_action('woocommerce_cart_totals_after_order_total', 'display_total_volume_in_cart'); function display_total_volume_in_cart() { $total_volume = calculate_cart_total_volume(); if ($total_volume > 0) { ?> <tr class="cart-total-volume"> <th><?php esc_html_e('总体积', 'woocommerce'); ?></th> <td data-title="<?php esc_attr_e('总体积', 'woocommerce'); ?>"> <?php echo wc_format_decimal($total_volume, 3) . ' m³'; ?> </td> </tr> <?php } }
在结算页添加总计行
用woocommerce_review_order_after_order_total钩子把总计行加到结算页的订单回顾区域:
// 在结算页添加总体积总计行 add_action('woocommerce_review_order_after_order_total', 'display_total_volume_in_checkout'); function display_total_volume_in_checkout() { $total_volume = calculate_cart_total_volume(); if ($total_volume > 0) { ?> <tr class="order-total-volume"> <th><?php esc_html_e('总体积', 'woocommerce'); ?></th> <td> <?php echo wc_format_decimal($total_volume, 3) . ' m³'; ?> </td> </tr> <?php } }
注意事项
- 替换代码中的
_product_volume为你实际使用的自定义字段键; - 可以根据需求调整小数位数(代码里用了3位,
wc_format_decimal($total_volume, 3)); - 把这些代码添加到你的主题
functions.php文件里,或者自定义插件中,避免主题更新丢失。
这样就能在购物车和结算页看到所有商品的总体积总计行啦!
内容的提问来源于stack exchange,提问作者James Donald
相关产品推荐
相关产品推荐

