筛选发布查询以仅显示类别的直接子项

时间:2014-05-01 作者:curly_brackets

如果你知道我的意思的话,谷歌在这个问题上似乎毫无建树。我一直在寻找这个话题以找到解决方案。

我想为我的类别建立一个查找器/浏览器的感觉,所以当浏览到一个类别时,我只想显示该类别的直接子类别,而不是该类别子类别中的帖子。

如果可能的话,我想更改当前的查询,而不做任何SQL查询。

I tried:

$posts = query_posts(\'cat=\'.$cat.\'&child_of=\'.$cat.\'&parent=\'.$cat);
还有一大堆其他的东西。。但我的想法快用完了。。。

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

我假设“类别的直接子类别”是指“直接分配给类别的帖子”,而不是“分配给指定类别的子类别的帖子”。

答案在法典中:

使用类别id显示具有此类别(不是该类别的子类别)的帖子:

$query = new WP_Query( \'category__in=4\' );

http://codex.wordpress.org/Class_Reference/WP_Query#Category_Parameters

第二,不要使用query_posts(). 它打击了好几个globals 把事情搞得一团糟。使用WP_Query.

$q = new WP_Query(
  array(
    \'category__in\' => $cat,
  )
);
这将创建一个辅助循环。要更改主查询,您需要连接到pre_get_posts, 正如《法典》中所解释的query_posts() 页码:

query_posts() 通过用查询的新实例替换页面的主查询来修改页面的主查询是一种过于简单且有问题的方式。它效率低下(重新运行SQL查询),并且在某些情况下会彻底失败(尤其是在处理POST分页时)。任何现代WP代码都应该使用更可靠的方法,例如pre_get_posts 挂钩,用于此目的。

换句话说:

function no_cat_kids_wpse_143042( $query ) {
  if ( $query->is_main_query() && $query->is_front_page() ) {
    $query->set( \'category__in\', 123 );
  }
}
add_action( \'pre_get_posts\', \'no_cat_kids_wpse_143042\' );
我不知道你需要什么条件,if ( $query->is_main_query() && $query->is_front_page() )-- 我不知道你是如何生成$cat 变量,但这就是想法。

将该代码放入functions.php 或插件。它必须在加载页面模板之前执行,才能影响主查询。

SO网友:T.Todua

Here is example:

add_action(\'pre_get_posts\',\'search_filterr\');function search_filterr($query) {
    if ( !is_admin() && $query->is_main_query() )   {
        if ( $query->is_search ) {  
                $query->set(\'post_type\',  array(\'post\',\'custom-posttt-too\')   );    
                $query->set(\'category__in\', 999 );   <------ enter the ID of your category!
            }
        }
    }
}
结束

相关推荐

我在使用WP_QUERY排序自定义帖子类型时遇到问题

我有一个自定义的职位类型,称为人员查看此代码:$args = array( \'post_type\' => \'personnel\', \'posts_per_page\' => -1, ); $personnel_query = new WP_Query( $args ); 上面的工作很好,但我希望帖子按字母顺序排序。我试过这个:$args = array( \'post_type\' =&