在具有多个帖子类型的查询中,是否可以将META_QUERY应用于一个特定的帖子类型?

时间:2014-09-04 作者:mike23

我有两种帖子类型,新闻和事件:

新闻没有自定义字段事件有两个自定义字段:开始日期和结束日期我想在同一页上显示新闻和事件,理想情况下只需一个查询。

一个重要的事实是,事件必须按结束日期排序,并且只能显示未来或当前的事件。

以下是我正在尝试的查询参数:

$args = array(
    \'post_type\' => array( \'news\', \'events\' ),
    \'meta_key\' => \'end-date\',
    \'orderby\' => \'meta_value\',
    \'order\' => \'ASC\',
    \'meta_query\' => array(
        array( 
            \'key\' => \'end-date\',
            \'value\' => date ( \'Ymd\' ),
            \'type\' => \'NUMERIC\',
            \'compare\' => \'>=\'
        )
    )
);
这仅适用于事件,但当我将新闻添加到帖子类型时就不行了。

问题似乎是我指定了“meta\\u key”和“meta\\u query”参数,这些参数只出现在事件中,因此结果中会遗漏所有的新闻。

所以我的问题是,有没有一种方法可以在同一个查询中将meta\\u查询定位到一个特定的post\\u类型?

2 个回复
SO网友:italiansoda

您可以将另一个数组添加到meta\\u查询中,以包含第二个帖子类型中的所有帖子。

在您的示例中,您有两种帖子类型

如果您可以选择meta_key 仅存在于news 但在上不存在events, 然后,这组参数将返回所有新闻帖子类型,并且仍然会过滤事件。

$args = array(
    \'post_type\' => array( \'news\', \'events\' ),
    \'meta_key\'  => \'end-date\',
    \'orderby\'   => \'meta_value\',
    \'order\'     => \'ASC\',
    \'meta_query\' => array(
        array( 
          \'key\'   => \'end-date\',
          \'value\' => date ( \'Ymd\' ),
          \'type\'  => \'NUMERIC\',
          \'compare\' => \'>=\'
        ),
        array(
          \'key\'      => \'my_unique_key_for_news\',
          \'compare\'  => \'EXISTS\'
        ),
        \'relation\' => \'OR\',
    )
);
Therelation => OR 这很重要。它说请返回适合您的end-dates 那是>= 今天,或所有与news (这将是所有新闻项目)。

通过这种方式,您可以明确事件的meta\\u值,但会返回新闻的所有结果,因此过滤器只保留第二种帖子类型。

SO网友:Tessa

由于新闻没有自定义字段,因此您可能会更幸运:

$args = array(
    \'post_type\' => array( \'news\', \'events\' ),
    \'orderby\' => \'end-date date\',
    \'meta_query\' => array(
        \'relation\' => \'OR\',
        array( 
          \'key\'   => \'end-date\',
          \'value\' => date ( \'Ymd\' ),
          \'type\'  => \'NUMERIC\',
          \'compare\' => \'>=\'
        ),
        array(
          \'key\'      => \'end-date\',
          \'compare\'  => \'NOT EXISTS\'
        )
    )
);
与ItaliantSoda的回答类似,“OR”关系将查找满足任一元查询的任何结果,第一个是特定于使用结束日期元字段的事件的帖子类型,另一个将很高兴地在该元字段不存在的任何新闻帖子类型中找到。

此外,我发现"meta_key" => "end-date" 在$args的顶级数组中,还排除了news-post类型。使用时,我无法判断结果的顺序是否正确,这是有效的还是巧合"orderby" => "end-date date", 从本质上讲,首先通过“结束日期”元字段设置结果排序的首选项,然后是帖子的发布日期。但它并没有破坏或排除结果。

或者,您可以执行“多个循环”以进行特定的控制。虽然这不是我最喜欢的方法,但它很有效,可以让您更好地控制特定帖子类型的参数。

第一个循环是获取所有的新闻帖子,并将它们作为帖子ID数组返回。它们是如何排序的在这里并不重要。

$news_ids = get_posts( array(
    \'fields\' => \'ids\',
    \'posts_per_page\' => -1,
    \'post_type\' => \'news\',
    \'post_status\' => \'publish\',
    //Add any additional parameters specific to news here
));//Returns an array of IDs
第二个循环是获取所有的事件帖子,并将它们作为帖子ID数组返回。它们的排序方式在这里也无关紧要。

$events_ids = get_posts( array(
    \'fields\' => \'ids\',
    \'posts_per_page\' => -1,
    \'post_type\' => \'events\',
    \'post_status\' => \'publish\',
    \'meta_query\' => array( array(
        \'type\' => \'NUMERIC\',
        \'key\' => \'end-date\',
        \'value\' => date( \'Ymd\' ),
        \'compare\' => \'>=\'
    ) ),
    //Add any additional parameters specific to events here
));//Returns an array of IDs
使用这两个数组,可以将它们合并到帖子ID的“主列表”中,然后用作post__in 在$args数组中。身份证的顺序在这里仍然无关紧要。

$all_ids = array_merge( $news_ids, $event_ids );//Combine all of the post IDs together into one array

$args = array(
    \'post_type\' => array( \'news\', \'events\' ),//Specify both post types here still
    \'post__in\' => $all_ids,//Only display posts from the "master list" of IDs
    //Add any additional parameters for sorting all of them here like...
    \'orderby\' => \'end-date date\',
    \'order\' => \'ASC\'
);
在$args数组中定义顺序和排序时,它们将应用于最后一个和第三个“循环”。

结束

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post