Need help with a wordpress-task

I want ALL the posts from sub categories to be excluded.


  • Cake
    • Pie
      • Apple
      • Pear
      • Banana

If i post a post in Banana, i don't want it to show up in Pie or Cake. I just want posts that are posted in banana to show in banana, not in the top categories.

How can i do this?

I found a code for it to put in functions.php but and it does the trick with the first category, but not the second.

function fb_filter_child_cats($query) {
$cat = get_term_by('name', $query->query_vars['category_name'], 'category');
$child_cats = (array) get_term_children( &$cat->term_id, 'category' );
// also possible
// $child_cats = (array) get_term_children( get_cat_id($query->query_vars['category_name']), 'category' );
if ( !$query->is_admin )
$query->set( 'category__not_in', array_merge($child_cats) );
return $query;
add_filter( 'pre_get_posts', 'fb_filter_child_cats' );
  • Could you please mark one of the answers as accepted? Or if you had any different implementation, suggest that and mark it as accepted Dec 29, 2015 at 16:40

4 Answers 4


Don't change your template, and please do not use query_posts.

Add this to your function.php:

add_action('pre_get_posts', 'filter_out_children');

function filter_out_children( $query ) {
  if ( is_main_query() && is_category() && ! is_admin() ) {
     $qo = $query->get_queried_object();
     $tax_query = array(
       'taxonomy' => 'category',
       'field' => 'id',
       'terms' => $qo->term_id,
       'include_children' => false
     $query->set( 'tax_query', array($tax_query) );

Easiest way is by using a Category Template.


Basically you want to have a category.php page, and then change

<?php while ( have_posts() ) : the_post(); ?>

to this

<?php while (have_posts()) : the_post(); if (in_category($cat)) { ?>


<?php endwhile; ?>


<?php } endwhile; ?>

I cannot test it right now, but you can try with this code:

$current_cat = intval( get_query_var('cat') );
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
   'category__and' => array($current_cat),
   'paged' => $paged,
   'caller_get_posts'=> 1


<?php if (have_posts()) : ?>

   Your content - here!


You need to edit the template file where you want to show the posts and put this code.


you can try this, it worked for me


// Subcategories IDs as an array

// In this example, the parent category ID is 3
$subcategories = get_categories('child_of=3');

$subcat_array = array();
foreach ($subcategories as $subcat) {
    $subcat_array[] = '-' . $subcat->cat_ID;

// we also include parent category ID in the list
$subcat_array[] = '-3';

// and then call query_posts
query_posts(array('category__not_in' => $subcat_array));


copied from


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.