web-dev-qa-db-ja.com

演算子 "NOT IN"が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 );

製品は正しくタグ付けされており、 gluten タグのない製品もあります。

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