如何配置WP_Query按日期及时间排序ACF事件并过滤已结束活动
嘿,我来帮你解决这个ACF日期时间排序和筛选的问题!你现在的需求是只显示尚未结束的活动,并且先按日期排序、日期相同的再按时间排序对吧?之前的代码只处理了日期的筛选和排序,没把时间因素结合进去,所以会出问题。我给你调整一下代码,应该就能搞定了:
<?php // 获取当前日期(格式匹配ACF日期字段的存储格式,默认是Ymd) $today = date('Ymd'); // 获取当前时间(格式匹配ACF时间字段的存储格式,默认是H:i:s) $current_time = date('H:i:s'); $compCount = array( 'post_type' => 'product', 'posts_per_page' => -1, // 核心:组合日期和时间的筛选条件 'meta_query' => array( 'relation' => 'OR', // 条件1:活动日期在今天之后 array( 'key' => 'comp_closing', 'compare' => '>', 'value' => $today, 'type' => 'DATE', // 指定字段类型为日期,确保比较准确 ), // 条件2:活动日期是今天,且结束时间在当前时间之后 array( 'relation' => 'AND', array( 'key' => 'comp_closing', 'compare' => '=', 'value' => $today, 'type' => 'DATE', ), array( 'key' => 'closing_time', 'compare' => '>=', 'value' => $current_time, 'type' => 'TIME', // 指定字段类型为时间,确保时间比较正确 ), ), // 为排序添加的查询子句(给orderby用) 'comp_closing_clause' => array( 'key' => 'comp_closing', 'type' => 'DATE', ), 'closing_time_clause' => array( 'key' => 'closing_time', 'type' => 'TIME', ), ), // 先按日期升序,日期相同则按时间升序 'orderby' => array( 'comp_closing_clause' => 'ASC', 'closing_time_clause' => 'ASC', ), ); // 执行查询 $comp_query = new WP_Query($compCount); ?>
关键逻辑说明:
- 筛选逻辑:用
relation => 'OR'把两种未结束的情况组合起来:要么日期在今天之后,要么日期是今天但时间还没到。这样就彻底排除了已经结束的活动(包括今天已经过了结束时间的)。 - 排序逻辑:通过添加
comp_closing_clause和closing_time_clause这两个查询子句,让orderby可以同时按日期和时间排序,优先排日期,日期相同的再按时间排序。 - 字段类型指定:添加
type => 'DATE'和type => 'TIME'能确保MySQL用正确的类型来比较值,避免字符串比较可能出现的错误(比如时间09:00和10:00的字符串比较是正常的,但如果字段格式不统一就容易出问题)。
最后提醒一下:如果你的ACF日期/时间字段修改过存储格式(比如日期用了Y-m-d),记得同步调整$today和$current_time的格式,比如date('Y-m-d'),否则比较会出错。
内容的提问来源于stack exchange,提问作者Mark Feltwell
相关产品推荐
相关产品推荐

