如何在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
相关产品推荐
相关产品推荐

