如何基于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
相关产品推荐
相关产品推荐

