This is very unusual case, and the only solution I can think of here is to get an array of category ids to include into category__in in order to skip posts that are only assigned to category 1
In order to achieve this, we must
-
use
get_terms()to get all the categories. We will use theexcludeparameter to exclude category1from that list. We will also set thefieldsparameter toidsin order to get an array of category ids -
pass the array from the result from
get_terms()tocategory__in
Example
$cat_ids = get_terms( 'category', array( 'fields' => 'ids', 'exclude' => 1 ) );
and then use it as follow
'category__in' => $cat_ids,
Just a note, you would need to check if you actually have categories returned by get_terms() and that no error is returned before you run your query. You don’t want to pass an empty array or error to category__in
EDIT
I have scrapped the get_categories idea and went with get_terms() as get_terms is used by get_categories and we can also set get_terms() to only return the category ids, and that is exactly all that is needed.
The original post is updated to reflect the changes