难道我不能通过这个过滤器修改主查询吗?

时间:2017-05-17 作者:Johansson

My Situation :

我的主题中有一个自定义的帖子类型,名为article.

我的网站有十几个类别,我在其中发布我的帖子,1specific 类别(命名BLOG) 只是为了发布article 在其中(没有post 仅在其中article).

我的文章有不同的结构,所以我不能将它们显示在与我在档案中显示的普通文章相同的列表中。所以,我决定只在BLOG 类别,以及其他类别中的正常职位。

这是我档案中的正常循环。php:

if ( have_posts() ) {
    while ( have_posts() ) {
        the_post(); 
        the_title();
    }
}
这是我的主题functions.php:

function archive_filtering($query){
    if ( $query->is_main_query() && $query->have_posts()){
        $query->set(\'post_type\', \'article\' );
    }
}
My Problem :

我希望上面的代码检查是否有此类帖子,如果其中没有帖子,那么我们可能会BLOG 类别因此,它应该包括article 在查询中发布类型,然后将其输出。

但它似乎不起作用。这是正确的方法吗?有没有办法做到这一点?

谢谢

2 个回复
最合适的回答,由SO网友:Nathan Johnson 整理而成

您的代码不能工作的原因是因为到了归档的时候。php运行时pre_get_posts 钩子已经开火了。

您可以在自己的功能中轻松完成任务。php文件:

add_action( \'pre_get_posts\', \'wpse_pre_get_posts\' );
function wpse_pre_get_posts( $query ) {
  remove_action( \'pre_get_posts\', \'wpse_pre_get_posts\' );
  //* $query->have_posts() will always return false from this hook
  //* So get the posts with the query to check if they\'re empty
  $posts = get_posts( $query->query );
  if( empty( $posts ) && $query->is_main_query() ) {
    $query->set( \'post_type\', \'article\' );
  }
}
然后是你的档案。php将是一个简单的循环:

if( have_posts() ) :
  while( have_posts() ) :
    the_post(); 
    the_title();
  endwhile;
endif;
这将为每个请求运行两次查询,我不会这样做,但我无法立即找到其他方法来执行您想要的操作。

谢谢@Milo。已编辑,因为在pre\\u get\\u posts挂钩处,查询尚未运行。嗯。

SO网友:Milo

场景中的问题是,在查询运行之前,您无法知道需要对查询进行哪些更改。当然,在它运行之后,进行更改为时已晚!

您提到您不知道所有文章所属的单一类别可能是什么。解决这个问题最简单的方法就是改变它。您需要某种方法来存储该选项,以便检查这是否是当前请求的类别,并在运行查询之前进行调整。

add_action( \'pre_get_posts\', \'wpd_check_cat\' );
function wpd_check_cat( $query ) {
    if( $query->is_category()
        && isset( $query->query_vars[\'category_name\'] )
        && \'blog\' == $query->query_vars[\'category_name\'] ){
            $query->set( \'post_type\', \'article\' );
        }
}

结束

相关推荐

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

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