Exclude category on blog list page

I’ve got a site with a News page (archive for category ‘news’) and a separate Blog page. When I make a post for the News page I select the category ‘news’. So, on the news page you only see the posts marked news, but on the blog page you can see all posts. What I would like to do is preferably show all posts EXCEPT the ‘news’ posts on the blog page. How do I do this?

<!--post start-->
            <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
                    <!--post start-->
                    <div class="post">
                        <div class="box">
                            <div class="postimgbox">
                                <?php if ((function_exists('has_post_thumbnail')) && (has_post_thumbnail())) { ?>
                                    <?php the_post_thumbnail(); ?>
                                <?php } else {

                                }
                                ?>
                            </div>
                            <ul class="post_meta">
                                <li class="post_date">&nbsp;&nbsp;<?php echo get_the_time('M, d, Y') ?></li>
                                <li class="post_comment">&nbsp;&nbsp;
                                <?php comments_popup_link('No Comments.', '1 Comment.', '% Comments.'); ?>
                                </li>
                                <br />
                                <li class="posted_by">&nbsp;&nbsp;
                                <?php the_author_posts_link(); ?>
                                </li>
                                <br />
                                <li class="post_category">&nbsp;&nbsp;
                                <?php the_category(', '); ?>
                                </li>
                                <br />
                            </ul>
                        </div>
                        <div class="post_content">
                            <h1 class="post_title"><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>">
                            <?php the_title(); ?>
                                </a></h1>
                    <?php the_excerpt(); ?>
                            <a class="read_more" href="<?php the_permalink() ?>"><?php _e('Read More', 'infoway'); ?>&nbsp;<span class="button-tip"></span></a> </div>
                    </div>
                    <!--End Post-->

Above is the code from blog.php, the php file I am trying to edit as it is the template for my blog page, (if it helps)

Related posts

3 comments

  1. From a plugin or your theme’s functions.php file:

    function wpse106861_mod_query( $query ) {
        /* are we on the blog page ? */
        if ( $query->is_home() && $query->is_main_query() ) {
            /* get ID of news category */
            $news_id = get_cat_ID( 'news' );
            /* exclude posts in new from query */
            $query->set( 'category__not_in' => array( $news_id ) );
        }
    }
    add_action( 'pre_get_posts', 'wpse106861_mod_query' );
    

    Update
    As for the comment:
    is_home should return true on any blog index page, regardless of whether that’s a static page or your front page. You can check for the front page directly as well anyhow, by slightly altering the conditional:

    if ( $query->is_front_page() && $query->is_main_query() )
    

    Related Reading

  2. You can do it with pre_get_posts filter. Do it like this:

    function my_exclude_category( $query ) {
        if ( $query->is_home() && $query->is_main_query() ) {
            $query->set( 'category__not_in', array( 1, 1347 ) );  // where 1 and 1347 are IDs of excluded categories
        }
    }
    add_action( 'pre_get_posts', 'my_exclude_category' );
    

    PS. I assume that this Blog page is set as your posts page.

  3. Thank you for replying to my question but after trying to do something else I have managed to work out the answer, and what I believe to be the easiest and shortest answer. In the main loop for posting the posts you will see something along the lines of

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

    Before this code add in the following line,

    <?php query_posts('cat=-4'); ?>
    

    Where 4 is the category id. The – sign means ‘not’ and is similar to ! in C. This will mean all posts not in category ID 4 will be displayed on that page

Comments are closed.