Есть способ использовать $ query-> set ('tax_query' в фильтре pre_get_posts?

16

Есть способ использовать $query->set('tax_query', ...)в pre_get_postsфильтре? например, следующий код не изменяет запрос. Обратите внимание, что я создаю $ таксономии и пользовательский поиск.

function custom_search_filter($query) {
        ...

        // array('taxonomy' => 'category', 'field' => 'id', 'terms' => array( 41,42 ), 'operator' => 'IN')
        $taxonomies = implode(',', $taxonomy_arr);

        // /wordpress/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 );

Заранее спасибо.

Хосе Пабло Ороско Марин
источник
1
Почему вы передаете WP_Queryобъект в метод установки аргумента?
t31os
Да, я был неправ, теперь я получил его, используя eval для преобразования строки в массив (и я действительно уверен, что строка безопасна). Благодарю.
Хосе Пабло Ороско Марин

Ответы:

35

$queryПеременный в фильтре представляет собой WP_Queryобъект, так что вы не должны быть пропусканием нового WP_Queryобъекта в метод для настройки свойств этого объекта.

Вопрос , который вы скопировали код из неправильно с помощью фильтра, который я чувствую это суть вашего вопроса.

Да, tax_queryможет использоваться внутри pre_get_posts(или аналогично parse_request) фильтра / действия.

Вот пример:
укажите пользовательскую таксономию для поисковых запросов

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

    $taxquery = array(
        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' );
t31os
источник
6
Не могли бы вы привести рабочий пример установки tax_query внутри действия pre_get_posts?
helgatheviking
$ tax_query - это объект, который содержит вложенный массив. Вы не можете переопределить объект с помощью вложенного массива.
AlxVallejo
3
$tax_queryэто не объект, $queryхотя (это экземпляр WP_Query).
t31os
2
Разве это не полностью переопределяет tax_query? не следует ли добавлять $ taxquery к текущим данным в аргументе tax_query?
hot_barbara
@hot_barbara, как он есть, перезапишет запрос tax_. Эта версия будет вместо этого добавлять текущий запрос: $ taxquery = array ('отношение' => 'OR', массив ('taxonomy' => 'career_event_type', 'field' => 'id', 'rules' => array ( 52), 'operator' => 'NOT IN'));
rambillo