Обычно я бы предпочел параметр "tax_query", например,
// in case there are other tax_query clauses on the query
$tax_query = (array) $query->get( 'tax_query' );
$tax_query[] = [
'taxonomy' => 'category',
'terms' => 11,
'field' => 'term_id',
'operator' => 'NOT IN'
];
$query->set( 'tax_query', $tax_query );
С другой стороны, если в запросе уже есть записи из категории «без категории», вы можете отсортировать результаты непосредственно перед отображением, подключив the_posts
, что-то вроде:
add_action( 'the_posts', function( $posts, $query ){
if ( ! $query->is_search() ) {
return $posts;
}
usort( $posts, function ( $a, $b ){
$a_in_uncategorized = has_term( 11, 'category', $a );
$b_in_uncategorized = has_term( 11, 'category', $b );
// if neither or both are on the "uncategorized" category
// sort by date or whatever
if ( $a_in_uncategorized === $b_in_uncategorized ) {
return $b->post_date <=> $a->post_date;
}
if ( $a_in_uncategorized && ! $b_in_uncategorized ) {
return 1;
}
if ( ! $a_in_uncategorized && $b_in_uncategorized ) {
return -1;
}
return 0;
} );
return $posts;
}, 10, 2 );
Надеюсь, это поможет: -)