1

I'm trying to exclude posts from a certain category from being displayed on my home.php.

The code that is in my theme is as follows:

query_posts(array('post__not_in' => $featured_posts_array));
                if (have_posts()) :
                    while (have_posts()) : the_post(); ?>
                        <div <?php post_class() ?> id="post-<?php the_ID(); ?>">
                            <div class="categories">
                                <h3><?php the_categories_excerpt(); ?></h3>

I tried adding the following before the query_posts ( function but it does nothing.

function exclude_category( $query ) {
    if ( is_feed() ) {
        $query = set_query_var( 'cat', '-1' );  
    }

    return $query;
}

add_filter( 'pre_get_posts', 'exclude_category' );

Is there some kind of format I need to follow?

3
  • So would this be the right format then? pastebin.com/cLpGvnRD And in the home.php, i'll be replacing the query_post section with this: filter_pre_get_posts() Commented Jun 15, 2012 at 15:14
  • No. Your Pastebin code isn't what I've got in my answer. And you don't ever need to call query_posts(), anywhere. (I'll update my answer to incorporate your featured posts function.) Commented Jun 15, 2012 at 15:19
  • Alright.. got it now. had to remove that piece of line query_posts(array('post__not_in' => $featured_posts_array)); Commented Jun 15, 2012 at 15:25

1 Answer 1

3

First, don't use query_posts(). Just get rid of the call entirely. It will break things.

Second:

I tried adding the following before the query_posts ( function but it does nothing.

Callbacks and add_action() calls belong in functions.php, not in the template file. If you've put it directly in home.php, remove it from there, and put it in functions.php.

Third:

Your pre_get_posts() filter uses the if ( is_feed() ) conditional. The is_feed() conditional returns true when an RSS feed is being output, not on the blog posts index (which is what is output via home.php). Try using is_home() instead.

Fourth:

Don't call set_query_var() inside your callback. Use $query->set() instead.

Putting it all together

Use the following in functions.php

<?php
function wpse55358_filter_pre_get_posts( $query ) {
    // Let's only modify the main query
    if ( ! is_main_query() ) {
        return $query;
    }
    // Modify the blog posts index query
    if ( is_home() ) {
        // Exclude Category ID 1
        $query->set( 'cat', '-1' );

        // Build featured posts array
        $featured_posts_array = featured_posts_slider();

        // Exclude featured posts
        $query->set( 'post__not_in', $featured_posts_array );
    }
    // Return the query object
    return $query;
}
add_filter( 'pre_get_posts', 'wpse55358_filter_pre_get_posts' );
?>

Questions

What category are you trying to exclude? Are you sure the ID is 1?

2
  • 1
    Another thing to note - you will almost always want to also check for $query->is_main_query() right away when altering the query via pre_get_posts. Otherwise you might affect secondary queries unintentionally (e.g. a nav menu). Commented Jun 15, 2012 at 14:37
  • I've updated the answer to incorporate featured_posts_slider(). Commented Jun 15, 2012 at 15:20

Your Answer

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

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