WooCommerce周末禁用加入购物车按钮代码无效,求解决
问题分析与修复方案
核心问题
- 触发逻辑未生效:你把
add_action('wp', 'cross_remove_add_to_cart_product_categories');放在了widget函数里,但这个函数只有WordPress渲染Widget时才会执行,导致移除加购按钮的代码根本没被触发。 - 时区冲突风险:直接用
date_default_timezone_set会覆盖WordPress后台设置的时区,应该用WP内置函数获取正确日期时间。 - 覆盖范围不全:当前代码只限制了「Regular Menu Items」分类页面,用户仍能通过单个产品页、购物车/结账页完成下单,需要补充这些场景的限制。
修复后的代码
// 判断店铺是否营业 function is_shop_open() { // 用WordPress后台时区获取当前星期几(1=周一,7=周日) $current_day = current_time('w'); $days_opened = array(1, 2, 3, 4, 5); // 周一至周五 return in_array($current_day, $days_opened, true); } // 移除加购按钮并限制下单 function restrict_weekend_orders() { if (!is_shop_open()) { // 移除分类页的加购按钮 remove_action('woocommerce_after_shop_loop_item', 'woocommerce_template_loop_add_to_cart'); // 移除单个产品页的加购按钮 remove_action('woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30); // 限制购物车和结账页 add_action('woocommerce_check_cart_items', 'block_weekend_checkout'); add_action('woocommerce_checkout_process', 'block_weekend_checkout'); } } // 用woocommerce_init钩子触发,确保在WooCommerce初始化后执行 add_action('woocommerce_init', 'restrict_weekend_orders'); // 阻止周末结账并提示信息 function block_weekend_checkout() { if (!is_shop_open()) { wc_add_notice('我们仅在工作日接受订单,请于周一至周五下单。', 'error'); } }
代码说明
- 时区处理:
current_time('w')会自动匹配WordPress后台设置的时区,避免手动设置时区导致的偏差。 - 触发时机:改用
woocommerce_init钩子触发限制逻辑,确保在WooCommerce加载后立即执行,不会错过任何页面的处理。 - 全面限制:
- 同时移除分类页和单个产品页的加购按钮,从源头阻止下单;
- 在购物车和结账页添加验证,即使用户通过特殊路径进入结账流程,也会被拦截并收到提示。
验证步骤
- 替换原有代码为修复后的版本,保存并激活Snippets;
- 把系统时间切换到周末测试:
- 查看「Regular Menu Items」分类页和单个产品页,确认加购按钮已消失;
- 尝试强制添加商品到购物车后进入结账页,会看到错误提示,无法完成下单。
内容的提问来源于stack exchange,提问作者spiritcross
相关产品推荐
相关产品推荐

