如何将元查询应用于主查询中的单个自定义帖子类型?

时间:2015-06-17 作者:Mats Mikkel Rummelhoff

我有一个自定义的帖子类型event, 其中有自定义字段start_dateend_date. 对于事件存档,我使用添加到pre_get_posts 过滤器,工作正常:

if ( is_post_type_archive( \'event\' ) ) {
    $query->set( \'meta_query\', array(
        \'relation\' => \'OR\',
        array(
            \'key\' => \'start_date\',
            \'value\' => $today = date( \'Ymd\' ),
            \'compare\' => \'>=\'
        ),
        array(
            \'key\' => \'end_date\',
            \'value\' => $today = date( \'Ymd\' ),
            \'compare\' => \'>=\'
        ),
    ) );
}
对于搜索查询,我也希望这样做。是否可以将元查询添加到主查询中,并将其仅应用于特定的帖子类型(即。event)? 伪代码(我知道这不起作用,但要举例说明):

if ( is_search() ) {
    $query->set( \'meta_query\', array(
        \'relation\' => \'OR\',
        array(
            \'key\' => \'post_type\',
            \'value\' => \'event\',
            \'compare\' => \'!=\',
        ),
        array(
            ....
}

2 个回复
最合适的回答,由SO网友:Mats Mikkel Rummelhoff 整理而成

如果start_date 自定义字段仅存在于event post类型,此功能:

$query->set( \'meta_query\', array(
    \'relation\' => \'OR\',
    array(
        \'key\' => \'start_date\',
        \'compare\' => \'NOT EXISTS\',
    ),
    array(
        \'key\' => \'start_date\',
        \'value\' => $today = date( \'Ymd\' ),
        \'compare\' => \'>=\',
    ),
    array(
        \'key\' => \'end_date\',
        \'value\' => $today = date( \'Ymd\' ),
        \'compare\' => \'>=\',
    ),
) );
通过比较start_date 关键点NOT EXISTS, 其他帖子类型不会被过滤掉。显然这不是一个理想的解决方案,所以我仍然很好奇是否有更好的想法。

SO网友:italiansoda

你给出的答案很聪明!!

另一种方法是选择一个只存在于第二个post类型上的新键,并与exists进行比较。

所以你的第二种帖子类型是search (从您的示例中不完全确定)。您的第一个帖子类型是event. 如果主查询正在搜索这两种帖子类型,那么此meta\\u查询将包括第二种帖子类型的所有帖子。

$query->set( \'meta_query\', array(
\'relation\' => \'OR\',
    array(
        \'key\' => \'my_exclusive_meta_key_for_my_other_post_type\',
        \'compare\' => \'EXISTS\',
    ),
    ...
) );

结束

相关推荐

AJAX加载更多帖子-WP_QUERY参数不起作用

我试图用一个Ajax加载更多帖子按钮来代替标准的WP分页。我基本上是按照this question 这在很大程度上很有效。以下是相关代码:HTML(博客索引页):<div id=\"content\"> <?php $args = array( \'posts_per_page\' => 5 ); if (isset($_GET[\'views\'])) { $args[\'orderby\'] = \'met