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

如何配置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 21:37:32