使用woocommerce_calculate_totals钩子设置自提运费为0的问题
解决WooCommerce自提时运费未清零的问题
Hey Marcus, let's break down why your shipping totals aren't resetting when switching back to store pickup, and fix it properly:
你的代码里的几个关键问题
- 参数错误:
woocommerce_calculate_totals钩子的回调参数是$cart对象,不是$order,你用错了参数类型,而且依赖global $woocommerce也不是最优方式。 - 不可靠的判断条件:依赖
$_POST['post_data']来检测配送方式是不稳定的——结账页的配送切换大多是AJAX触发的,刷新页面或某些场景下$_POST数据会不存在,应该用WooCommerce的session来获取选中的配送方式。 - 逻辑可能倒置:你的代码里如果检测到
local-delivery就什么都不做,否则清零运费,但如果你的自提方式ID不是这个(比如默认自提是local_pickup),这个判断就不会触发。 - 未彻底重置运费状态:只修改
shipping_total和shipping_tax_total不够,WooCommerce还有其他关联的运费计算变量需要重置。
修正后的代码
add_action('woocommerce_calculate_totals', function($cart) { // 跳过后台操作,且购物车为空时不执行 if (is_admin() && !defined('DOING_AJAX')) return; if ($cart->is_empty()) return; // 获取当前选中的配送方式(WooCommerce官方推荐的方式) $chosen_shipping_methods = WC()->session->get('chosen_shipping_methods'); $chosen_method = reset($chosen_shipping_methods); // 替换成你实际的自提方式ID,比如默认Local Pickup的ID是'local_pickup' if (strpos($chosen_method, 'local_pickup') !== false) { // 清零运费和运费税 $cart->shipping_total = 0.00; $cart->shipping_tax_total = 0.00; // 彻底重置运费计算状态 $cart->shipping_methods = array(); $cart->remove_shipping_calculations(); } }, 40, 1);
关键说明
- 确认自提方式ID:你可以在WooCommerce后台「配送」→「配送方式」里,找到你的自提方式,查看它的slug(比如默认Local Pickup的slug是
local_pickup),把代码里的local_pickup替换成实际值。 - 使用session获取配送方式:
WC()->session->get('chosen_shipping_methods')是WooCommerce存储用户选中配送方式的官方位置,比依赖$_POST可靠得多。 - 重置运费状态:
remove_shipping_calculations()会清除WooCommerce内部的运费计算缓存,确保切换自提后不会残留之前的运费数据。
内容的提问来源于stack exchange,提问作者Marcus Christiansen
相关产品推荐
相关产品推荐

