it-swarm.com.ru

Оператор "НЕ В" не работает в tax_query

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

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

Мой код почти работает, за исключением параметра operator .

Я бросаю этот запрос:

http://example.com/?s=gluten

Эта функция возвращает все товары, помеченные как поисковый запрос:

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

Продукты правильно помечены, и есть продукты без клейковины тег

2
NiloVelez

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

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

4
MacPrawn