You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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:

你的代码里的几个关键问题

  1. 参数错误:woocommerce_calculate_totals钩子的回调参数是$cart对象,不是$order,你用错了参数类型,而且依赖global $woocommerce也不是最优方式。
  2. 不可靠的判断条件:依赖$_POST['post_data']来检测配送方式是不稳定的——结账页的配送切换大多是AJAX触发的,刷新页面或某些场景下$_POST数据会不存在,应该用WooCommerce的session来获取选中的配送方式。
  3. 逻辑可能倒置:你的代码里如果检测到local-delivery就什么都不做,否则清零运费,但如果你的自提方式ID不是这个(比如默认自提是local_pickup),这个判断就不会触发。
  4. 未彻底重置运费状态:只修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:08:10