从类别显示中排除子类别帖子

时间:2014-03-02 作者:Steve

我的职位类别结构如下:

在外观>菜单中,我添加了3个菜单项。

新闻、会议、时事通讯类别各一份。

然而,新闻页面也会显示来自会议和新闻稿的帖子。

如何排除子类别中的帖子显示在父类别的页面中?

谢谢

6 个回复
SO网友:1fixdotio

我重写了a post at WP Engineer:

function wpse_filter_child_cats( $query ) {

if ( $query->is_category ) {
    $queried_object = get_queried_object();
    $child_cats = (array) get_term_children( $queried_object->term_id, \'category\' );

    if ( ! $query->is_admin )
        //exclude the posts in child categories
        $query->set( \'category__not_in\', array_merge( $child_cats ) );
    }

    return $query;
}
add_filter( \'pre_get_posts\', \'wpse_filter_child_cats\' );
将代码片段粘贴到functions.php. 请记住,帖子不能同时属于父类别和子类别,否则无法显示。

SO网友:Daniel Von Fange

使用category__in 而不是cat 在您的查询中。

你已经知道了,cat 将查询类别及其子类别:

$category = get_category (get_query_var(\'cat\'));
WP_Query( \'cat\'=>$category, \'post_type\' => \'post\' );
但是,当使用category__in, 您将无法从子类别中获得结果。

$category = get_category (get_query_var(\'cat\'));
WP_Query( \'category__in\'=>$category, \'post_type\' => \'post\' );
有关的文档querying based on categories 在这里。

SO网友:TheRealMikeD

如果要包括任何和所有具有当前正在查询的类别的帖子,可以使用以下命令。这可能包括具有所查询类别的子/子类别的帖子,但前提是它们也具有父类别。它将不包括只有子类别的帖子。换言之,鉴于以下情况:

第1类

第2类,是第2类的子类

只有类别1的帖子A

B柱,仅具有类别2

C类邮政编码,包括1类和2类

此查询将返回帖子A和C,但不会返回帖子B

function cat_query_filter($query) {
    if (!is_admin() && $query->is_main_query() && is_category()) {
        $queried_cat_obj = get_queried_object();
        $queried_cat_id = $queried_cat_obj->term_id;
        $query->set(\'category__in\', $queried_cat_id);
    }
}
add_action(\'pre_get_posts\', \'cat_query_filter\');
@createscape提供的答案很好,但会排除像post B这样的帖子,这可能是您想要的,也可能不是您想要的。因此,根据您想要包含在结果列表中的内容,您可以使用该解决方案,也可以使用此解决方案。此处的其他信息:https://developer.wordpress.org/reference/classes/wp_query/#category-parameters

SO网友:coyotech

这可以很好地防止子类别中的帖子显示在父类别列表中。但是,请确保在该父类别中有一篇文章,否则,如果有人单击父类别菜单项,则会出现“未找到”错误。

SO网友:createscape

我编写了自己的函数,以便从循环中排除子类别的帖子,因为我发现上面的代码对我不起作用。

在我的主题存档中。php文件,在循环上方,我列出了子类别:

    <?php
       $current_cat = get_queried_object();

       $args = array( \'parent\'=>$current_cat->term_id, \'child_of\' => $current_cat->term_id, );
        $categories = get_categories( $args );
        foreach($categories as $category) { ?>

           <h2><?php echo $category->name ;?></h2>
           <p> etc....</p>
      <?php } ?>
在我的功能中。php文件中,我使用pre\\u get\\u posts添加了以下自定义函数:

add_action( \'pre_get_posts\', \'main_query_without_subcategory_posts\' );

function main_query_without_subcategory_posts( $query ) {

if ( ! is_admin() && $query->is_main_query() ) {
    // Not a query for an admin page.
    // It\'s the main query for a front end page of your site.

    if ( is_category() ) {

   //Get the current category
        $current_category = get_queried_object();
        //get the id of the current category
        $current_cat_id = $current_category->term_id;

        //find the children of current category
        $cat_args = array( \'parent\'=>$current_category->term_id, \'child_of\' => $current_category->term_id, );
        $subcategories = get_categories( $cat_args );

        //Get a list of subcategory ids, stick a minus sign in front
        $subcat_id = array();         
        foreach($subcategories as $subcategory) { 
            $subcat_id[] = " -". $subcategory->term_id; 
        }

        //join them together as a string with a comma seperator          
        $excludesubcatlist = join(\',\', $subcat_id);

       //If you have multiple parameters, use $query->set multiple times
        $query->set( \'posts_per_page\', \'10\' );
        $query->set( \'cat\', \'\'.$current_cat_id.\',\'.$excludesubcatlist.\'\' );
      }
    }
  }
然后在存档中。php,在子类别下面,我添加了常规WordPress循环,该循环现在正被上述函数修改:

<?php  while (have_posts() ) : the_post(); ?>
     <h2><?php the_title();?></h2>
     <p> etc....</p>
 <?php endwhile;?>
虽然WordPress codex说使用“category\\uu in”会将帖子从子类别中排除,但这对我来说并不管用,子类别帖子仍在显示。

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

https://developer.wordpress.org/reference/hooks/pre_get_posts/

SO网友:mainpart

好的,到2019年为止,我不得不使用稍微修改过的代码,它可以用于任何分类法。不仅仅是标准类别。我将其用于woocommerce和wp的设置,防止产品嵌套类别显示在父目录中:

add_action(\'parse_tax_query\', \'wpse_filter_child_cats\'); 

function wpse_filter_child_cats( $query ) {
    if ( is_tax( \'product_cat\' ) ) {

        $queried_object = get_queried_object();
        $child_cats     = (array) get_term_children( $queried_object->term_id, \'product_cat\' );

        if ( ! $query->is_admin ) //exclude the posts in child categories
        {

            $query->tax_query->queries[] = [
                \'taxonomy\' => \'product_cat\',
                \'field\'    => \'term_id\',
                \'terms\'    => array_merge( $child_cats ),
                \'operator\' => \'NOT IN\'
            ];
        }

    }

}

结束

相关推荐

Completely disable categories

有人知道有一个插件在WP中禁用了类别吗?我的意思是,对于现有用户和新用户,完全自动地从视图中隐藏该功能。特别是:WP admin菜单、帖子列表、它的屏幕选项和过滤器、帖子编辑器和它的屏幕选项、widgets屏幕、writing和permalink设置屏幕我遇到了各种老化的黑客来完成这一部分工作,其中大部分是用来禁用元框的代码和一些用来禁用permalink前缀的插件。我之所以选择这样做,是希望一些网页设计师或开发人员能够掌握整套功能。如果没有,在过去的3-4年中,是否会有新的API使过程变得更简单(我的W