从wp_query中排除所有子类别

时间:2013-08-01 12:12:53

标签: php wordpress loops

我一直在寻找高低,并回答这个问题,但我不确定这是否可能!

我有一个WP_Query可以从几乎所有内容中提取帖子,但是,我希望排除特定类别和/或所有子类别。

搜索人们尚未找到解决方案。

到目前为止,这是我的查询:

$args = array(
    'post_type' => 'sell_media_item',
    'cat' => -98,
    'orderby' => 'desc',
    'paged' => $paged,
    'posts_per_page' => 20
); ?>

<?php $loop = new WP_Query( $args ); ?>

我认为只是排除cat 98也会抓住所有子类别,但显然不是。

我尝试过使用:

category__not_indepth=0parent=0甚至an adaptation of this,没有运气。

有什么想法吗?

[编辑] 我正在使用名为Collections的自定义分类法,因此将'collection' => 'vip'放入查询意味着它只会显示此集合。我在想是否有一种方法可以扭转这种情况,所以它排除了集合呢?

由于无法列出此处将显示的所有类别,因为它们将一直在变化。

[编辑2] 在下面的评论中讨论之后,这是更新的代码。

$ex = array(
    'taxonomy' => 'collection',
    'child_of' => 98,
    'hide_empty' => 0
);
$categories = get_categories($ex);

$categoriesToExclude = array();
foreach ($categories as $category) {
    $categoriesToExclude[] = $category->cat_ID;
}

echo('<pre>'); var_dump($categories);


$args = array(
    'post_type' => 'sell_media_item',
    'category__not_in' => $categoriesToExclude,
    'orderby' => 'desc',
    'paged' => $paged,
    'posts_per_page' => 20
); ?>

<?php echo('<br /><pre>'); var_dump($args); ?>

<?php $loop = new WP_Query( $args ); ?>

3 个答案:

答案 0 :(得分:4)

我会使用get_categories()获取所有子类别的列表,然后根据结果构建一个'cat'排除数组。

$args = array('parent' => 98);
$categories = get_categories($args);

$categoriesToExclude = array();
foreach ($categories as $category) {
    $categoriesToExclude[] = $category->cat_ID;
}


$args = array(
    'post_type' => 'sell_media_item',
    'category__not_in' => $categoriesToExclude,
    'orderby' => 'desc',
    'paged' => $paged,
    'posts_per_page' => 20
); ?>

<?php $loop = new WP_Query( $args ); ?>

这只是一个例子,您可能需要稍微修改它以满足您的需求。

答案 1 :(得分:0)

原来如此!

看来我试图做不可能的事。我无法让这个剧本适合我的生活。所以我尝试了不同的角度。我没有排除自定义分类法及其术语,而是决定将我的所有其他术语移到父术语中,而只是调用它。

如果有人感兴趣的话,这是代码......

<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;               

$args = array(
    'post_type' => 'sell_media_item',
    'taxonomy' => 'collection',
    'term' => 'clubs',
    'orderby' => 'desc',
    'paged' => $paged,
    'posts_per_page' => 20
);


$loop = new WP_Query( $args );

if ( $loop->have_posts() ) : while ($loop->have_posts()) : $loop->the_post(); ?>

答案 2 :(得分:0)

我编写了自己的函数,目的是使用上述文章和其他地方的技巧从循环中排除子类别的文章。

在我的主题archive.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 } ?>

在我的functions.php文件中,我使用pre_get_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.'' );
      }
    }
  }

然后在子类别下面的archive.php中,添加了常规的WordPress循环,该循环现在已被上述函数修改:

<?php  while (have_posts() ) : the_post(); ?>
     <h2><?php the_title();?></h2>
     <p> etc....</p>
 <?php endwhile;?>

尽管WordPress Codex表示使用“ category__in”将排除子类别中的帖子,但这对我不起作用,并且子类别帖子仍在显示。

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

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