WordPress按规则获取events自定义文章类型符合条件的活动记录
WordPress自定义活动类型按优先级取数解决方案
你原有代码存在两个核心逻辑问题,导致取数不符合预期:
- 未对活动日期字段
e_date做筛选、排序,默认按文章发布时间返回结果,会出现发布时间更晚的预告类内容排在未到举办日期的正式活动前的情况 - 用
OR关联e_active、e_forecast两个标记字段做查询,没有区分两类内容的校验优先级,无法满足「先校验正式活动、再校验活动预告」的规则
推荐实现(数据库层直接筛选,性能最优)
不建议拉取多条记录到PHP层遍历,直接按优先级分两次查询,既能严格匹配校验规则,性能也远高于遍历方案,代码如下:
$matched_event = null; // 注意:此处日期格式需要和你ACF字段e_date的存储格式保持一致 // 默认ACF日期选择器存储格式为Ymd,如果存时间戳/Y-m-d请自行调整对应格式 $current_date = date('Ymd', current_time('timestamp')); // 第一优先级:查询未来举办的正式活动,取距离当前最近的1条 $active_events = get_posts([ 'post_type' => 'events', 'post_status' => 'publish', 'numberposts' => 1, 'meta_key' => 'e_date', 'orderby' => 'meta_value', 'order' => 'ASC', // 按活动日期升序,最近举办的排在最前 'meta_query' => [ 'relation' => 'AND', [ 'key' => 'e_active', 'value' => '1', 'compare' => '=' ], [ 'key' => 'e_date', 'value' => $current_date, 'compare' => '>', 'type' => 'DATE' // 若e_date存时间戳请改为NUMERIC ] ] ]); if (!empty($active_events)) { $matched_event = $active_events[0]; } else { // 第二优先级:无未来正式活动时,查询未来举办的活动预告,取距离当前最近的1条 $forecast_events = get_posts([ 'post_type' => 'events', 'post_status' => 'publish', 'numberposts' => 1, 'meta_key' => 'e_date', 'orderby' => 'meta_value', 'order' => 'ASC', 'meta_query' => [ 'relation' => 'AND', [ 'key' => 'e_forecast', 'value' => '1', 'compare' => '=' ], [ 'key' => 'e_date', 'value' => $current_date, 'compare' => '>', 'type' => 'DATE' // 若e_date存时间戳请改为NUMERIC ] ] ]); if (!empty($forecast_events)) { $matched_event = $forecast_events[0]; } } // 结果处理 if ($matched_event) { // 此处写匹配到活动后的输出逻辑,例:echo get_the_title($matched_event->ID); } else { // 兜底逻辑,例:输出"暂无即将举办的活动" }
遍历实现方案(按需选用)
如果你确实需要拉取最近N条记录后在PHP层遍历校验(比如需要叠加其他特殊判断逻辑),可以参考以下写法,注意拉取条数不足时可能出现漏匹配问题:
$matched_event = null; $current_timestamp = current_time('timestamp'); // 拉取最近发布的10条活动 $recent_events = get_posts([ 'post_type' => 'events', 'post_status' => 'publish', 'numberposts' => 10, 'orderby' => 'date', 'order' => 'DESC' ]); // 第一轮遍历:匹配符合要求的正式活动 foreach ($recent_events as $event) { $is_active = get_field('e_active', $event->ID); $event_date = strtotime(get_field('e_date', $event->ID)); if ($is_active && $event_date > $current_timestamp) { $matched_event = $event; break; } } // 第一轮无匹配,第二轮遍历匹配活动预告 if (!$matched_event) { foreach ($recent_events as $event) { $is_forecast = get_field('e_forecast', $event->ID); $event_date = strtotime(get_field('e_date', $event->ID)); if ($is_forecast && $event_date > $current_timestamp) { $matched_event = $event; break; } } } // 结果处理逻辑和上述方案一致
注意事项
- 使用前请确认
e_date字段的存储/返回格式,调整日期比对的格式和类型参数,避免出现比对错误 - 正式活动、预告活动的查询均按活动日期升序排列,默认返回距离当前日期最近的即将举办的活动,如果需要返回最远的活动可以把排序规则改为
DESC
内容的提问来源于stack exchange,提问作者marjerry
相关产品推荐
相关产品推荐

