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

如何在WooCommerce中实现特定产品加入购物车时同步将运费税设置为零

解决WooCommerce运费税未随运费清零的问题

嘿,我懂你现在的困扰——已经成功把特定商品加入购物车后的运费设为0了,但运费税还顽固地留在那里,对吧?其实只需要在现有代码里加几行,就能把运费税也一并清零,正好符合你提到的类似$rate->tax = 0;的思路。

问题根源

你原来的代码只修改了运费的cost属性,但WooCommerce的运费费率对象里,税费是单独存储在taxes数组(对应多个税类)和tax属性(对应总税费)里的,所以需要同时处理这几个部分。

修改后的完整代码

function adjust_shipping_rate( $rates ){
    global $free_product_id;
    // 用WooCommerce内置方法获取购物车商品数量,更高效
    $cart_counter = WC()->cart->get_cart_contents_count();
    $product_ids = array_merge( 
        wp_list_pluck(WC()->cart->get_cart_contents(), 'variation_id'), 
        wp_list_pluck(WC()->cart->get_cart_contents(), 'product_id') 
    );
    
    if ( $cart_counter > 1 && in_array($free_product_id, $product_ids)){
        foreach ($rates as $rate) {
            // 清零运费成本
            $rate->cost = 0;
            
            // 清零所有运费税项(应对多税类场景)
            if ( !empty($rate->taxes) ) {
                foreach ($rate->taxes as $tax_key => $tax_amount) {
                    $rate->taxes[$tax_key] = 0;
                }
            }
            
            // 清零总运费税属性(兼容部分WooCommerce版本)
            $rate->tax = 0;
            
            // 强制更新运费的总金额(包含税的总和)
            $rate->set_total(0);
        }
    }
    return $rates;
}
add_filter( 'woocommerce_package_rates', 'adjust_shipping_rate', 50, 1 );

关键修改说明

  • 替换购物车计数方式:用WC()->cart->get_cart_contents_count()替代手动循环,代码更简洁高效
  • 处理多税类场景:遍历$rate->taxes数组,把每个税项的金额设为0,避免漏掉不同地区或类型的税费
  • 兼容不同版本:同时设置$rate->tax = 0,确保在部分WooCommerce版本中总税费也被清零
  • 强制更新总金额:调用$rate->set_total(0)让系统重新计算运费总价,确保前端显示正确

重要提示

修改代码后,记得去WooCommerce后台的设置 > 配送页面,点击「清除缓存」按钮。因为WooCommerce会缓存配送费率,不清除的话新规则可能不会立即生效哦!

内容的提问来源于stack exchange,提问作者SammyR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 17:27:41