添加特定商品后WooCommerce整单免运费失效问题及代码排查
解决WooCommerce特定商品加入购物车后整单免运费失效问题
原代码存在的问题
你提供的代码未生效,主要有3个核心原因:
- 依赖全局
$woocommerce对象,新版本WooCommerce官方更推荐使用WC()->cart标准方式获取购物车实例,避免全局变量带来的兼容性问题。 - 仅检查
product_id,如果触发免运费的是变体商品,购物车项中存储的product_id是父商品ID,会导致漏判变体商品的情况。 - 过滤器优先级设为20,可能被其他更高优先级的逻辑覆盖;同时未处理后台设置的免费配送最低消费限制(如果有配置的话)。
修正后的代码
将以下代码添加到主题的functions.php文件或自定义插件中即可:
function enable_free_shipping_for_eligible_product( $is_available, $package ) { // 替换为你的免运费触发商品ID $eligible_product_ids = array( 560 ); // 确保购物车实例存在 if ( ! WC()->cart ) { return $is_available; } // 遍历购物车所有商品,检查是否有符合条件的商品 foreach ( WC()->cart->get_cart() as $cart_item ) { $product_id = $cart_item['product_id']; $variation_id = $cart_item['variation_id']; // 同时检查父商品ID和变体ID,覆盖普通商品和变体商品场景 if ( in_array( $product_id, $eligible_product_ids ) || in_array( $variation_id, $eligible_product_ids ) ) { // 强制启用免费配送,忽略后台设置的最低消费限制 return true; } } // 无符合条件商品,保留原有运费设置 return $is_available; } add_filter( 'woocommerce_shipping_free_shipping_is_available', 'enable_free_shipping_for_eligible_product', 99, 2 );
关键注意事项
- 必须启用免费配送方式:在WooCommerce后台「设置 → 配送 → 配送区域」中,确保已添加并启用「免费配送」这个配送方法,否则代码无法触发对应逻辑。
- 清除缓存:修改代码后,清空浏览器缓存、WooCommerce缓存(如果安装了缓存插件),避免旧的运费计算逻辑被缓存导致不生效。
- 确认商品ID正确:商品ID可在商品编辑页面的URL中查看(例如
wp-admin/post.php?post=560&action=edit中的560就是商品ID)。
内容的提问来源于stack exchange,提问作者Molly
相关产品推荐
相关产品推荐

