WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

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' );
share|improve this question
Could you please mark one of the answers as accepted? Or if you had any different implementation, suggest that and mark it as accepted – Rohit Pande Dec 29 '15 at 16:40

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; ?>

See http://motioncity.com.ar/2008/wordpress-tip-how-to-exclude-children-categories-on-a-template/ for more details

share|improve this answer

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) );
share|improve this answer

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.

share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

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