Оператор "NOT IN" не работает в tax_query
Я пытаюсь изменить функциональность поиска в магазине WooCommerce, чтобы при запросе пользователя, который соответствует слагу product_tag
, возвращались товары, не имеющие этого тега.
Логика заключается в показе всех товаров без глютена пользователю, который ищет "глютен".
Мой код почти работает, за исключением параметра operator.
Я выполняю этот запрос:
http://example.com/?s=глютен
Эта функция возвращает все товары с тегом, соответствующим поисковому запросу:
function menta_pre_get_posts( $query ) {
if ( !is_admin() && $query->is_search() && $query->is_main_query() ) {
$term = get_term_by('slug', get_query_var('s'), 'product_tag');
if ( $term && !is_wp_error( $term ) ) {
$tax_query = array(
'taxonomy' => 'product_tag',
'field' => 'slug',
'terms' => $term->slug,
'operator' => 'IN'
);
$query->tax_query->queries[] = $tax_query;
$query->query_vars['tax_query'] = $query->tax_query->queries;
}
}}
add_action( 'pre_get_posts', 'menta_pre_get_posts', 1 );
Но если я меняю оператор на NOT IN, я не получаю результатов:
function menta_pre_get_posts( $query ) {
if ( !is_admin() && $query->is_search() && $query->is_main_query() ) {
$term = get_term_by('slug', get_query_var('s'), 'product_tag');
if ( $term && !is_wp_error( $term ) ) {
$tax_query = array(
'taxonomy' => 'product_tag',
'field' => 'slug',
'terms' => $term->slug,
'operator' => 'NOT IN'
);
$query->tax_query->queries[] = $tax_query;
$query->query_vars['tax_query'] = $query->tax_query->queries;
}
}}
add_action( 'pre_get_posts', 'menta_pre_get_posts', 1 );
Товары правильно помечены тегами, и существуют товары без тега глютен.
Я подозреваю, что вам нужен массив для терминов - хотя я не уверен, почему это работает с "IN", но не работает с "NOT IN"... Но я бы попробовал так:
function menta_pre_get_posts( $query ) {
if ( !is_admin() && $query->is_search() && $query->is_main_query() ) {
$term = get_term_by('slug', get_query_var('s'), 'product_tag');
if ( $term && !is_wp_error( $term ) ) {
$tax_query = array(
'taxonomy' => 'product_tag',
'field' => 'slug',
'terms' => array($term->slug),
'operator' => 'NOT IN'
);
$query->tax_query->queries[] = $tax_query;
$query->query_vars['tax_query'] = $query->tax_query->queries;
$query->set('tax_query', $query->tax_query->queries);
}
}}
add_action( 'pre_get_posts', 'menta_pre_get_posts', 1 );
Надеюсь, это поможет!

Спасибо, но я только что попробовал это, и запрос по-прежнему не возвращает результаты

Хмм. Ладно. Раньше мне иногда также приходилось добавлять $query->set('tax_query', $query->tax_query->queries);
-- смотрите мой обновленный ответ.

Вы также можете отладить запрос, чтобы увидеть, что WP строит на основе вашего фильтра: https://codex.wordpress.org/Editing_wp-config.php#Save_queries_for_analysis

Это не является ответом на вопрос. Когда у вас будет достаточно репутации, вы сможете оставлять комментарии к любым сообщениям; вместо этого предоставляйте ответы, не требующие уточнений от автора вопроса. - Из обзора
