Exclude the category from the WordPress loop

you could use wp_parse_args() to merge your arguments into the default query

// Define the default query args
global $wp_query;
$defaults = $wp_query->query_vars;

// Your custom args
$args = array('cat'=>-4);

// merge the default with your custom args
$args = wp_parse_args( $args, $defaults );

// query posts based on merged arguments
query_posts($args);

although, i think the more elegant route is using the pre_get_posts() action. this modifies the query before the query is made so that the query isn’t run twice.

check out:

http://codex.wordpress.org/Custom_Queries#Category_Exclusion

based on that example to exclude category 4 from the index i’d put this in your functions.php:

add_action('pre_get_posts', 'wpa_44672' );

function wpa_44672( $wp_query ) {

    //$wp_query is passed by reference.  we don't need to return anything. whatever changes made inside this function will automatically effect the global variable

    $excluded = array(4);  //made it an array in case you  need to exclude more than one

    // only exclude on the home page
    if( is_home() ) {
        set_query_var('category__not_in', $excluded);
        //which is merely the more elegant way to write:
        //$wp_query->set('category__not_in', $excluded);
    }
}

Leave a Comment