register_post_type()
has a argument exclude_from_search
that you can set to true
for your to-be-exempt post types, so you don't have to dabble with a "hidden" term work around.
Alternatively you can hook into the search query itself via pre_get_posts
and modify which post types you're after:
add_filter('pre_get_posts',function ($query) {
if ($query->is_search && !is_admin() )
$query->set('post_type',array('post','page'));
return $query;
});
If you were set on the taxonomy hiding, you'd do somthing like:
add_action( 'pre_get_posts', function ( $query ) {
global $wp_the_query;
if( $query === $wp_the_query && $query->is_search() ) {
$tax_query = array(
array(
'taxonomy' => 'category',
'field' => 'slug',
'terms' => 'hidden',
'operator' => 'NOT IN',
)
);
$query->set( 'tax_query', $tax_query );
}
});