在META_QUERY中使用OR关系在按另一个值排序之前检查值

时间:2021-06-03 作者:mtm

我正在为一个具有事件列表功能的站点编写一对查询。活动可以在一个日期或多个日期(多天)进行。所有事件在自定义字段中都有一个值event_date. 多日活动也有end_date 价值

单日事件应在“即将到来的事件”列表(第一次查询)中,直到其结束event_date, 多日活动应持续到活动结束end_date. 一旦他们不再在即将到来的列表中,他们应该移到“过去的事件”列表(新查询,同一页)。

即将进行的查询工作正常。多日活动在其event_dateend_date 值:

$now     = date(\'Ymd\', strtotime("now"));
$future  = date(\'Ymd\', strtotime("+24 months"));
$uc_args = array(
    \'post_type\'  => \'event\',
    \'meta_query\' => array(
        \'relation\' => \'OR\',
        // check post has end_date and it is between $now and $future
        array(
            \'key\'     => \'end_date\',
            \'compare\' => \'BETWEEN\',
            \'type\'    => \'NUMERIC\',
            \'value\'   => array($now, $future),
        ),
        // if no end date check event_date is between $now and $future
        array(
            \'key\'     => \'event_date\',
            \'compare\' => \'BETWEEN\',
            \'type\'    => \'NUMERIC\',
            \'value\'   => array($now, $future),
        ),
    ),
    \'meta_key\' => \'event_date\',
    \'orderby\'  => \'meta_value\',
    \'order\'    => \'ASC\',
    \'nopaging\' => true,
);

过去的查询是以完全相同的方式构造的,但多日事件在其event–date 已经过去了,即使他们有end_date 值:

$past    = date(\'Ymd\', strtotime("-999 months"));
$now     = date(\'Ymd\', strtotime("now"));
$uc_args = array(
    \'post_type\'  => \'event\',
    \'meta_query\' => array(
        \'relation\'  => \'OR\',
        // check post has end_date and it is between $past and $now
        array(
            \'key\'     => \'end_date\',
            \'compare\' => \'BETWEEN\',
            \'type\'    => \'NUMERIC\',
            \'value\'   => array($past, $now),
        ),
        // if no end date check event_date is between $past and $now
        array(
            \'key\'     => \'event_date\',
            \'compare\' => \'BETWEEN\',
            \'type\'    => \'NUMERIC\',
            \'value\'   => array($past, $now),
        ),
    ),
    \'meta_key\'       => \'event_date\',
    \'orderby\'        => \'meta_value\',
    \'order\'          => \'DESC\',
    \'nopaging\'       => false,
    \'posts_per_page\' => \'8\',
);

我可以看到OR关系如何包含所有满足任一条件的帖子,但在第一个查询中它没有这样做。据我所知,没有其他关系,但这就是我在这里的目标。

为什么这适用于即将举行的活动,但不适用于过去的活动?

1 个回复
SO网友:phatskat

我认为这可能是您过去的查询(第二个)中存在的问题的一部分

        array(
            \'key\'     => \'end_date\',
            \'compare\' => \'BETWEEN\',
            \'type\'    => \'NUMERIC\',
            \'value\'   => array($past, $now),
        ),
您正在使用BETWEEN 但我觉得< 这就是你想要的。您不想显示在之间结束的事件$past$now, 正当您希望显示通常已结束的事件。

        array(
            \'key\'     => \'end_date\',
            \'compare\' => \'<\',
            \'type\'    => \'NUMERIC\',
            \'value\'   => $now,
        ),

相关推荐

WP_QUERY选择具有高级定制字段(ACF)日期的定制帖子类型

如果没有提供足够的详细信息,请在本论坛上发布第一篇帖子。我正在尝试使用WP\\u Query收集具有高级自定义字段(WP Plugin)的CPT;结束日期“;,该字段是日期选择器。我希望查询返回其个人之前的所有帖子;“结束日期”;以及所有没有;“结束日期”;如果用户不知道/不想添加。基本上,如果;“结束日期”;已通过。以下是我迄今为止所做的尝试,但收效甚微 $meta_query = array( \'relation\' => \'OR\',