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.

  • 1
    Why are you passing a WP_Query object into an argument setting method?
    – t31os
    Dec 1, 2011 at 1:06
  • Yes i was wrong, now i got it using eval to convert the string into an array (and im really sure that the string is safe). Thanks. Dec 1, 2011 at 12:14

2 Answers 2


The $query variable in the filter represents a WP_Query object, so you shouldn't be passing a new WP_Query object into the method for setting that object's properties.

The question you copied code from was incorrectly using the filter, which i feel is the crux of your issue.

Yes, tax_query can be used inside a pre_get_posts (or similarly parse_request) filter/action.

Here is an example:
Specify a custom taxonomy for search queries

function search_filter_get_posts($query) {
    if ( !$query->is_search )
        return $query;

    $taxquery = array(
            'taxonomy' => 'career_event_type',
            'field' => 'id',
            'terms' => array( 52 ),
            'operator'=> 'NOT IN'

    $query->set( 'tax_query', $taxquery );

add_action( 'pre_get_posts', 'search_filter_get_posts' );
  • 7
    could you give a working example of setting the tax_query inside a pre_get_posts action? Feb 22, 2012 at 20:05
  • $tax_query is an object that contains a nested array. You can't override the object with a nested array.
    – AlxVallejo
    Apr 17, 2013 at 19:11
  • 4
    $tax_query is not an object, $query is though(it's an instance of WP_Query).
    – t31os
    Apr 17, 2013 at 21:29
  • 2
    doesn't this completely override the tax_query? shouldn't $taxquery be appended to the current data in the tax_query arg? May 25, 2018 at 19:33
  • @hot_barbara as it stands, it would overwrite the tax_query. This version would append the current query instead: $taxquery = array( 'relation' => 'OR', array( 'taxonomy' => 'career_event_type', 'field' => 'id', 'terms' => array( 52 ), 'operator'=> 'NOT IN' ) );
    – rambillo
    Jan 20, 2020 at 22:20

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.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.