WooCommerce中PHP代码无法禁用指定日期前免运费的问题排查
WooCommerce禁用指定日期前免运费代码失效原因及修复方案
代码失效原因
- 日期比较逻辑不够可靠:原代码将时间戳转成字符串后比较,虽然Y-m-d格式字符串可按字典序比较,但直接用时间戳对比更精准,能避免潜在的格式转换问题。
- 依赖固定配送方式ID:WooCommerce中免运费方式的ID不一定是
free_shipping,手动添加的免运费选项ID可能带后缀(比如free_shipping:7),直接unset固定ID会匹配不到目标方式。 - 未处理配送费率缓存:WooCommerce会缓存配送选项,即使代码修改正确,缓存未清除的话也不会立即生效。
修复后的代码
add_filter( 'woocommerce_package_rates', 'disable_free_shipping_until_certain_date', 10, 2 ); function disable_free_shipping_until_certain_date($rates, $package) { // 获取当前日期的时间戳(精确到当天0点) $current_timestamp = strtotime(date("Y-m-d")); // 设置禁用截止日期的时间戳(2024-02-25 0点) $disable_until_timestamp = strtotime('2024-02-25'); // 当前日期早于截止日期时,禁用所有免运费选项 if ($current_timestamp < $disable_until_timestamp) { // 遍历所有配送方式,匹配类型为免运费的选项 foreach ($rates as $rate_key => $rate) { if ('free_shipping' === $rate->method_id) { unset($rates[$rate_key]); } } } return $rates; }
注意事项
- 清除配送费率缓存:代码生效前,需在WooCommerce后台进入「配送」设置页面,随便修改一个选项再保存,或清空网站缓存,触发配送费率缓存刷新。
- 验证配送方式类型:如果仍不生效,可通过
var_dump($rates)打印配送方式数据,确认目标免运费方式的method_id是否为free_shipping。
内容的提问来源于stack exchange,提问作者EQ0920
相关产品推荐
相关产品推荐

