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

使用以下代码后WooCommerce运费未计入订单总额,如何修复?

问题修复方案

问题说明

找到的代码可阻止加入购物车及购物车页面的运费计算,结算页面运费计算功能正常,但选择配送方式后运费未计入订单总额。

原代码如下:

function filter_need_shipping($val) {
    // Check if we need to recalculate shipping
    if (!is_admin()) {
        $prevent_after_add = WC()->session->get('prevent_recalc_on_add_to_cart');
        return $val && !$prevent_after_add;
    }
    return $val;
}
add_filter('woocommerce_cart_needs_shipping', 'filter_need_shipping');

function mark_cart_not_to_recalc() {
    // Mark the cart not to recalculate when adding items
    if (!is_admin()) {
        WC()->session->set('prevent_recalc_on_add_to_cart', true);
    }
}
add_action('woocommerce_before_calculate_totals', 'mark_cart_not_to_recalc');


// Unset the flag when proceeding to checkout
add_action('woocommerce_checkout_init', 'unset_prevent_recalc_flag');
function unset_prevent_recalc_flag() {
    if (!is_admin()) {
        WC()->session->__unset('prevent_recalc_on_add_to_cart');
    }
} 

问题原因

woocommerce_before_calculate_totals钩子会在结算页面计算订单总额时重复触发,导致即使在woocommerce_checkout_init中清除了prevent_recalc_on_add_to_cart标记,后续的计算操作又会重新将该标记设为true,使得woocommerce_cart_needs_shipping过滤器返回false,运费无法被计入订单总额。

修复后的代码

function filter_need_shipping($val) {
    if (!is_admin()) {
        $prevent_after_add = WC()->session->get('prevent_recalc_on_add_to_cart');
        return $val && !$prevent_after_add;
    }
    return $val;
}
add_filter('woocommerce_cart_needs_shipping', 'filter_need_shipping');

function mark_cart_not_to_recalc() {
    // 仅在非结算页面设置标记
    if (!is_admin() && !is_checkout()) {
        WC()->session->set('prevent_recalc_on_add_to_cart', true);
    }
}
// 降低钩子优先级,确保结算时的清除操作先执行
add_action('woocommerce_before_calculate_totals', 'mark_cart_not_to_recalc', 20);

// 结算初始化时清除标记
add_action('woocommerce_checkout_init', 'unset_prevent_recalc_flag');
function unset_prevent_recalc_flag() {
    if (!is_admin()) {
        WC()->session->__unset('prevent_recalc_on_add_to_cart');
    }
} 

修复说明

  1. 修改mark_cart_not_to_recalc函数,增加!is_checkout()判断,仅在非结算页面设置阻止运费计算的标记,避免结算时被重复设置。
  2. 调整woocommerce_before_calculate_totals钩子的优先级为20,确保woocommerce_checkout_init中的标记清除操作先执行,保证结算页面的运费计算不受影响。

内容的提问来源于stack exchange,提问作者T.MC

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 04:52:50