Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

Need help with a wordpress-task

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

Example:

  • 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
add comment

3 Answers

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
add comment

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;
$args=array(
   'category__and' => array($current_cat),
   'paged' => $paged,
   'caller_get_posts'=> 1
);
query_posts($args);

?>

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

   Your content - here!

wp_reset_query();

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

share|improve this answer
add comment

Easiest way is by using a Category Template.

http://codex.wordpress.org/Category_Templates

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)) { ?>

and

<?php endwhile; ?>

to

<?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
add comment

Your Answer

 
discard

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.