Оператор "NOT IN" не работает в tax_query

13 февр. 2017 г., 16:14:06
Просмотры: 16.1K
Голосов: 4

Я пытаюсь изменить функциональность поиска в магазине 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 );

Товары правильно помечены тегами, и существуют товары без тега глютен.

0
Все ответы на вопрос 2
4

Я подозреваю, что вам нужен массив для терминов - хотя я не уверен, почему это работает с "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 );

Надеюсь, это поможет!

13 февр. 2017 г. 23:12:04
Комментарии

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

NiloVelez NiloVelez
14 февр. 2017 г. 09:41:32

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

nibnut nibnut
14 февр. 2017 г. 12:42:15

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

nibnut nibnut
14 февр. 2017 г. 12:43:33

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

NiloVelez NiloVelez
15 февр. 2017 г. 16:28:15
1

В дополнение к ответу @nibnut, я рекомендую сначала проверить наличие tax_query в запросе, чтобы случайно не перезаписать их:

$query->tax_query->queries      = (array) $query->get( 'tax_query' );
9 июн. 2022 г. 07:00:38
Комментарии

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

vancoder vancoder
10 июн. 2022 г. 00:11:03