You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 22:54:17