使用以下代码后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'); } }
修复说明
- 修改
mark_cart_not_to_recalc函数,增加!is_checkout()判断,仅在非结算页面设置阻止运费计算的标记,避免结算时被重复设置。 - 调整
woocommerce_before_calculate_totals钩子的优先级为20,确保woocommerce_checkout_init中的标记清除操作先执行,保证结算页面的运费计算不受影响。
内容的提问来源于stack exchange,提问作者T.MC
相关产品推荐
相关产品推荐

