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

如何基于ACF日期字段让WooCommerce分组商品提前24小时不可购买?

WooCommerce 分组商品限时预购实现方案

核心逻辑

通过 WooCommerce 的 woocommerce_is_purchasable 过滤器,结合 ACF 的「date」元字段,判断当前时间是否处于活动开始前24小时至活动开始时间的窗口内,不符合条件则禁用商品购买权限。

代码实现

将以下代码添加到主题的 functions.php 文件或自定义功能插件中:

add_filter('woocommerce_is_purchasable', 'restrict_pre_purchase_to_24_hours_before_event', 10, 2);
function restrict_pre_purchase_to_24_hours_before_event($purchasable, $product) {
    // 初始化活动日期时间戳
    $event_timestamp = 0;

    // 判断当前商品是否是分组商品的子商品
    if ($product->is_type('variation') || ($product->is_type('simple') && $product->get_parent_id())) {
        // 获取父商品(活动主商品)
        $parent_product = wc_get_product($product->get_parent_id());
        // 从父商品获取ACF日期字段
        $event_date = get_field('date', $parent_product->get_id());
    } else {
        // 当前商品是分组主商品,直接获取自身的ACF日期字段
        $event_date = get_field('date', $product->get_id());
    }

    // 转换日期为时间戳(确保ACF字段格式为可被strtotime解析的格式,如Y-m-d H:i)
    if ($event_date) {
        $event_timestamp = strtotime($event_date);
    }

    // 如果没有获取到有效活动日期,保持原有购买权限
    if (!$event_timestamp) {
        return $purchasable;
    }

    // 计算活动开始前24小时的时间戳
    $pre_purchase_start_timestamp = $event_timestamp - (24 * 60 * 60);
    // 获取当前时间戳(适配WordPress时区设置)
    $current_timestamp = current_time('timestamp');

    // 判断当前时间是否在预购窗口内
    if ($current_timestamp < $pre_purchase_start_timestamp || $current_timestamp > $event_timestamp) {
        // 不在窗口内,禁用购买权限
        return false;
    }

    // 在窗口内,保持原有购买权限
    return $purchasable;
}

关键说明

  • ACF字段格式:确保你的「date」字段设置为可被 strtotime() 解析的格式(比如「YYYY-MM-DD HH:mm」),如果仅设置纯日期(如YYYY-MM-DD),会默认按当天0点计算活动时间。
  • 商品类型适配:代码同时兼容分组主商品和其关联的子商品(简单商品/变体),自动从父商品读取活动日期。
  • 权限保留:如果商品未设置「date」字段,会保持原有购买权限逻辑,不影响其他商品。

内容的提问来源于stack exchange,提问作者Jana Lux

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 00:20:31