WooCommerce美国订单条件设零税率时购物车小计计算为0问题
问题原因
- 取值方式错误:
woocommerce_before_calculate_totals钩子触发时,购物车商品的line_total字段还未完成系统初始化计算,此时读取该字段默认返回0,累加结果自然不对。 - 业务逻辑写反:当前代码逻辑是税前金额小于800美元时直接终止执行,大于等于800才设置零税率,和你要求的「小于800用零税率」的需求完全相反。
修正方案
直接通过商品对象获取单价乘以购买数量来累加税前总金额,同时调整逻辑判断方向,修改后的代码如下:
add_action( 'woocommerce_before_calculate_totals', 'apply_conditionally_zero_tax_rate', 10, 1 ); function apply_conditionally_zero_tax_rate( $cart ) { if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return; if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 ) return; if ( WC()->customer->get_shipping_country() !== 'US' ) return; $defined_amount = 800; $subtotal = 0; // 改用商品单价*数量计算税前总金额,避免line_total未初始化的问题 foreach ( $cart->get_cart() as $cart_item ) { $subtotal += $cart_item['data']->get_price() * $cart_item['quantity']; } // 逻辑调整:小于800才设置零税率,否则不修改原有税类 if ( $subtotal < $defined_amount ) { foreach ( $cart->get_cart() as $cart_item ) { $cart_item['data']->set_tax_class( 'zero' ); } } }
注:请确认你后台WooCommerce税类设置里,零税率对应的slug确实为zero,如果自定义过slug请替换为对应值即可生效。
内容的提问来源于stack exchange,提问作者Manu
相关产品推荐
相关产品推荐

