Excluding posts from a category but only if they’re not in multiple categories

I am looking to exclude a category in WordPress. I am referring to the WordPress Codex page on wp_query but I am having the following problem:

  1. I want to exclude posts from category 1,
  2. but if a post is in category 1 and category 2 (or any other category
    other than 1), then I still want it to show.

So, I only want posts to be excluded if they’re exclusively in category 1.

1 Answer
1

This can be done by getting an array of category ids you want to show. We can use get_terms() for this:

$taxonomy = array(
    'category'
);
$args = array(
    'exclude' => array('111'),//id of the category term you want to exclude  
    'fields' => 'ids'
);
$ct_ids = get_terms( $taxonomy, $args );

Now you can use this to create your secondary query with WP_Query by using the Category Parameter category__in like this:

$args = array(
    'category__in' => $ct_ids
);
$scnd_query = new WP_Query( $args );

If you for example want to do this just for your home page, than there is no need for a custom secondary query, you can achieve it by hooking into the pre_get_posts action like this:

function show_all_but_category_xyz( $query ) {
    if ( !is_admin() && $query->is_home() && $query->is_main_query() ) {
        $query->set( 'category__in', $ct_ids );
    }
}
add_action( 'pre_get_posts', 'show_all_but_category_xyz' );

Leave a Comment