Theres a way to use $query->set('tax_query', ...)
in pre_get_posts
filter? for example next code is not altering the query. Note that I’m building $taxonomies from and custom search.
function custom_search_filter($query) {
...
// array('taxonomy' => 'category', 'field' => 'id', 'terms' => array( 41,42 ), 'operator' => 'IN')
$taxonomies = implode(',', $taxonomy_arr);
// https://wordpress.stackexchange.com/questions/25076/how-to-filter-wordpress-search-excluding-post-in-some-custom-taxonomies
$taxonomy_query = array('relation' => 'AND', $taxonomies);
$query->set('tax_query', $taxonomy_query);
}
return $query;
}
add_filter( 'pre_get_posts', 'custom_search_filter', 999 );
Thanks in advance.
The
$query
variable in the filter represents aWP_Query
object, so you shouldn’t be passing a newWP_Query
object into the method for setting that object’s properties.The question you copied code from was incorrectly using the action, which may have been the crux of your issue.
Yes,
tax_query
can be used inside apre_get_posts
action or similarly by hookingparse_request
,request
orparse_query
.Here is an example:
Specify a custom taxonomy for search queries
Although it should be noted more specificity with your conditional parameters might help in avoiding making alterations to queries you do not intend to.
For example, if you are utilising a custom search form to search on a custom post type, including a hidden field(or even a select box) to set the
post_type
would help out with providing extra conditional specificity.The above example
pre_get_posts
(or equivalent) action/filter would then have more information to validate we’re modifying the right kind of request/query.or
You could go further and use a query var parameter you’re not otherwise expecting in the search query that WordPress supports, just to act a flag for your action/filter.
This provides another conditional parameter for your action to look for, and you can simply unset the value before it reaches the query.
Tax queries require you to also set the tax_query object in the query since the query has already been parsed. See my answer for Modify Taxonomy pages to exclude items in child taxonomies.