WooCommerce指定日期后禁用Add to cart按钮并修改按钮标签
WooCommerce活动商品到期自动禁用预订按钮实现方案
不需要修改Elementor模板,直接通过WooCommerce原生钩子实现逻辑,兼容你现有的ACF字段、Elementor通用商品模板配置,所有活动商品会自动根据自身的start_date字段值判断是否到期。
操作步骤
- 选择代码插入方式,两种二选一即可,优先选第一种避免主题更新丢失配置:
- 方式1:安装Code Snippets插件,新建一个代码片段粘贴代码,启用即可,不需要修改主题文件,对新手更友好
- 方式2:WordPress后台进入「外观」-「主题文件编辑器」,选中当前在用的子主题,找到
functions.php文件,把代码粘贴到文件最末尾保存
- 将下方完整代码粘贴到对应位置,保存并启用
// 活动开始后禁止商品购买 add_filter('woocommerce_is_purchasable', 'disable_purchase_when_event_started', 99, 2); function disable_purchase_when_event_started($purchasable, $product){ if(is_admin()) return $purchasable; $product_id = $product->get_id(); // 优先读取ACF字段,兼容普通自定义字段存储 $event_start = get_field('start_date', $product_id); if(!$event_start){ $event_start = get_post_meta($product_id, 'start_date', true); } if(!$event_start) return $purchasable; // 兼容时间戳、日期字符串两种存储格式 $event_start_ts = is_numeric($event_start) ? intval($event_start) : strtotime($event_start); // 按WordPress后台设置的时区获取当前时间 $current_ts = current_time('timestamp'); if($current_ts >= $event_start_ts){ $purchasable = false; } return $purchasable; } // 修改到期商品的按钮文字为Event Ended add_filter('woocommerce_product_add_to_cart_text', 'change_ended_event_button_text', 99); add_filter('woocommerce_product_single_add_to_cart_text', 'change_ended_event_button_text', 99); function change_ended_event_button_text($text){ global $product; if(!$product) return $text; $product_id = $product->get_id(); $event_start = get_field('start_date', $product_id); if(!$event_start){ $event_start = get_post_meta($product_id, 'start_date', true); } if(!$event_start) return $text; $event_start_ts = is_numeric($event_start) ? intval($event_start) : strtotime($event_start); $current_ts = current_time('timestamp'); return $current_ts >= $event_start_ts ? 'Event Ended' : $text; } // 商品列表页给到期按钮加禁用属性 add_filter('woocommerce_loop_add_to_cart_args', 'add_disabled_attr_to_ended_button', 99, 2); function add_disabled_attr_to_ended_button($args, $product){ $product_id = $product->get_id(); $event_start = get_field('start_date', $product_id); if(!$event_start){ $event_start = get_post_meta($product_id, 'start_date', true); } if(!$event_start) return $args; $event_start_ts = is_numeric($event_start) ? intval($event_start) : strtotime($event_start); $current_ts = current_time('timestamp'); if($current_ts >= $event_start_ts){ $args['attributes']['disabled'] = 'disabled'; } return $args; } // 商品详情页给到期按钮加禁用属性 add_action('woocommerce_after_add_to_cart_button', 'add_disabled_attr_to_single_ended_button'); function add_disabled_attr_to_single_ended_button(){ global $product; if(!$product) return; $product_id = $product->get_id(); $event_start = get_field('start_date', $product_id); if(!$event_start){ $event_start = get_post_meta($product_id, 'start_date', true); } if(!$event_start) return; $event_start_ts = is_numeric($event_start) ? intval($event_start) : strtotime($event_start); $current_ts = current_time('timestamp'); if($current_ts >= $event_start_ts){ echo '<script>document.querySelector(".single_add_to_cart_button").setAttribute("disabled","disabled")</script>'; } } // 后端拦截绕过前端的恶意加购请求 add_action('woocommerce_add_to_cart_validation', 'block_ended_event_add_to_cart', 99, 2); function block_ended_event_add_to_cart($passed, $product_id){ $event_start = get_field('start_date', $product_id); if(!$event_start){ $event_start = get_post_meta($product_id, 'start_date', true); } if(!$event_start) return $passed; $event_start_ts = is_numeric($event_start) ? intval($event_start) : strtotime($event_start); $current_ts = current_time('timestamp'); if($current_ts >= $event_start_ts){ wc_add_notice('This event has ended, booking is closed.', 'error'); $passed = false; } return $passed; }
- 清空站点缓存(包括缓存插件、CDN、浏览器缓存),找一个已过开始时间的活动商品测试,确认按钮显示为Event Ended且无法点击,未到时间的商品正常显示Book Now按钮可下单即可。
注意事项
- 代码自动按WordPress后台「设置」-「常规」里配置的时区做时间对比,不需要额外调整时区参数,和你现有短代码的时间计算逻辑一致
- 逻辑覆盖前端展示+后端校验,就算用户绕过前端按钮直接发送加购请求,也会被系统拦截,不会出现活动结束后仍被下单的情况
- 如果后续要修改到期后的按钮文字,直接改代码里
'Event Ended'的字符串内容即可,要改拦截提示文字就修改对应提示的字符串
内容的提问来源于stack exchange,提问作者Avinish Kr. Singh Rajawat
相关产品推荐
相关产品推荐

