基于指定配送类别调整WooCommerce购物车总重量
问题分析与解决方案
你的代码报错核心原因有两点:
- 钩子使用错误:
woocommerce_cart_calculate_fees是用来添加订单费用的钩子,并非修改购物车重量的正确钩子,用它调用set_cart_contents_weight()会触发逻辑冲突。 - 逻辑不完整:代码固定添加14克,未按实际配送类别情况切换重量,也没处理WooCommerce的重量单位转换(默认多为千克,直接加14会变成14千克而非14克)。
修正后的完整代码
我们把配送类别调整和重量修改合并到同一个钩子中,确保逻辑顺序严谨:
// 将2个信箱件转换为1个标准包裹并调整订单重量 add_action( 'woocommerce_before_calculate_totals', 'adjust_shipping_class_and_weight', 10, 1 ); function adjust_shipping_class_and_weight( $cart ) { if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return; if ( ! $cart->needs_shipping() ) return; $count_343 = 0; $count_344 = 0; // 统计配送类别343和344的商品总数量 foreach( $cart->get_cart() as $item ) { $shipping_class_id = $item['data']->get_shipping_class_id(); if ( $shipping_class_id === 343 ) { $count_343 += $item['quantity']; } elseif ( $shipping_class_id === 344 ) { $count_344 += $item['quantity']; } } // 第一步:调整配送类别(保留原逻辑) if ( $count_343 >= 2 ) { foreach( $cart->get_cart() as $item ) { if ( $item['data']->get_shipping_class_id() === 343 ) { $item['data']->set_shipping_class_id( 344 ); // 同步更新统计数量,确保重量计算基于最新状态 $count_343 -= $item['quantity']; $count_344 += $item['quantity']; } } } // 第二步:根据条件添加额外重量 $extra_weight = 0; // 注意:若你的WooCommerce重量单位是克,直接写14和54即可;以下是千克单位的转换值 if ( $count_343 === 1 ) { $extra_weight = 0.014; } elseif ( $count_344 >= 1 || $count_343 >= 2 ) { $extra_weight = 0.054; } if ( $extra_weight > 0 ) { $current_total_weight = $cart->get_cart_contents_weight(); $cart->set_cart_contents_weight( $current_total_weight + $extra_weight ); } }
代码说明
- 合并钩子逻辑:将两个操作放在
woocommerce_before_calculate_totals中,确保先完成配送类别转换,再基于最新状态计算重量。 - 单位适配:根据后台设置的重量单位调整数值,注释中已标注克和千克的转换方式。
- 条件覆盖:严格匹配需求:
- 仅1个343商品时加14克对应重量
- 存在344商品或多个343商品时加54克对应重量
- 状态同步:修改配送类别后更新统计数量,避免重量计算出现偏差。
内容的提问来源于stack exchange,提问作者chalcopterus
相关产品推荐
相关产品推荐

