如何通过Hook/Filter强制开启免运费?不满足条件时代码失效问题
解决WooCommerce活动日强制免运费问题
问题核心是:当订单未达后台设置的免运费最低金额时,WooCommerce不会生成free_shipping配送选项,原代码因找不到对应rate无法生效。需要主动创建并添加免运费选项到配送列表中。
解决方案代码
function force_free_shipping_on_event_day( $rates ) { // 设置活动日期,格式为YYYY-MM-DD,可按需调整判断逻辑 $event_date = '2024-10-01'; if ( date('Y-m-d') !== $event_date ) { return $rates; // 非活动日返回原配送选项 } // 可选:移除所有现有配送选项,仅保留免运费 // $rates = array(); // 创建免运费配送选项 $free_shipping_rate = new WC_Shipping_Rate(); $free_shipping_rate->set_id( 'free_shipping:event' ); // 自定义唯一ID $free_shipping_rate->set_method_id( 'free_shipping' ); $free_shipping_rate->set_label( '活动专属免运费' ); // 前端显示的配送名称 $free_shipping_rate->set_cost( 0 ); $free_shipping_rate->set_taxes( array() ); // 将免运费选项加入配送列表 $rates['free_shipping:event'] = $free_shipping_rate; return $rates; } add_filter( 'woocommerce_package_rates', 'force_free_shipping_on_event_day', 200 );
代码说明
- 活动日期校验:通过日期对比仅在指定活动日生效,不影响日常配送规则。
- 主动生成配送选项:直接实例化
WC_Shipping_Rate对象,手动配置免运费参数,确保无论订单金额多少,该选项都会出现。 - 灵活保留原有选项:若无需隐藏其他配送方式,可保留原有rates,用户会同时看到免运费和其他配送选项;若只想保留免运费,取消注释移除原有rates的代码即可。
- 优先级设置:200的优先级确保在WooCommerce默认配送逻辑执行后覆盖结果。
注意事项
- 代码需添加到主题的
functions.php文件或自定义插件中。 - 测试前请清除WooCommerce配送缓存(后台「WooCommerce > 设置 > 配送 > 配送区域」页面点击「清除缓存」),避免旧规则干扰测试结果。
内容的提问来源于stack exchange,提问作者mr.work
相关产品推荐
相关产品推荐

