基于WooCommerce购物车商品配送类与数量显示补贴总额的问题
修复WooCommerce基于配送类计算并显示补贴总额的问题
原代码存在多个逻辑和语法错误,以下是修正后的完整实现方案:
原代码核心问题
- 变量作用域错误:
$quantity、$product等变量在循环外定义,无法获取当前购物车项的对应数据 - 循环内提前返回:第一次循环就直接返回结果,无法统计所有购物车商品的补贴总额
- 变量初始化错误:
$subsidio_total初始化为字符串,会导致数值加法运算异常 - 函数调用错误:拼写错误且误用对象调用方式,实际应为全局函数调用
- 未处理无配送类的情况:会触发
get_term返回false,进而调用slug属性报错
修正后的完整代码
/** * 计算购物车商品的总补贴金额 * * @return float */ function get_subsidies_total() { $subsidio_total = 0; // 确保购物车对象存在 if ( ! WC()->cart ) { return $subsidio_total; } $cart = WC()->cart; // 遍历所有购物车商品 foreach ( $cart->get_cart() as $cart_item ) { $product = $cart_item['data']; $quantity = $cart_item['quantity']; $shipping_class_id = $product->get_shipping_class_id(); // 仅当商品有有效配送类时计算补贴 if ( empty( $shipping_class_id ) ) { continue; } $shipping_class_term = get_term( $shipping_class_id, 'product_shipping_class' ); // 验证配送类术语有效性 if ( ! is_a( $shipping_class_term, 'WP_Term' ) ) { continue; } // 根据配送类slug匹配补贴金额 switch ( $shipping_class_term->slug ) { case 'envio-gratis-o-preferente-125': $subsidio_subtotal = 125; break; case 'envio-gratis-o-preferente-73': $subsidio_subtotal = 73; break; case 'envio-preferente-50': $subsidio_subtotal = 50; break; case 'envio-preferente-30': $subsidio_subtotal = 30; break; case 'envio-preferente-25': $subsidio_subtotal = 25; break; case 'envio-preferente-12-50': $subsidio_subtotal = 12.5; break; case 'envio-preferente-5': $subsidio_subtotal = 5; break; default: $subsidio_subtotal = 0; break; } // 累加当前商品的补贴金额 $subsidio_total += ( $quantity * $subsidio_subtotal ); } return $subsidio_total; } /** * 在购物车页面显示补贴总额 */ add_action( 'woocommerce_cart_totals_before_shipping', 'display_subsidies_total', 10 ); /** * 在结账页面显示补贴总额 */ add_action( 'woocommerce_review_order_before_shipping', 'display_subsidies_total', 10 ); function display_subsidies_total() { $subsidio_total = get_subsidies_total(); // 仅当补贴金额大于0时显示 if ( $subsidio_total > 0 ) { ?> <tr class="cart-subtotal"> <th><?php esc_html_e( '补贴总额', 'woocommerce' ); ?></th> <td><?php echo wc_price( $subsidio_total ); ?></td> </tr> <?php } }
关键修改说明
- 调整变量作用域:将
$product、$quantity等变量移入循环内部,确保每次循环获取当前购物车项的对应数据 - 修正返回逻辑:将
return语句移至循环结束后,保证统计所有商品的补贴总额 - 初始化数值变量:将
$subsidio_total初始化为0,确保数值运算正常 - 增加有效性判断:验证配送类术语的有效性,避免无配送类商品导致的报错
- 优化匹配逻辑:用
switch替代多分支if-else,代码更简洁易维护 - 适配双页面显示:同时添加购物车和结账页的钩子,确保两处都能显示补贴
- 统一页面样式:采用WooCommerce原生表格行结构,保持页面风格一致
内容的提问来源于stack exchange,提问作者Eduardo Relax
相关产品推荐
相关产品推荐

