web-dev-qa-db-fra.com

L'opérateur "NOT IN" ne fonctionne pas dans tax_query

J'essaie de modifier les fonctionnalités de recherche d'un magasin WooCommerce. Ainsi, lorsqu'un utilisateur effectue une requête qui correspond à un slug product_tag, il renvoie les produits auxquels aucune balise n'est attribuée.

La logique derrière ceci montre tous les produits sans gluten à un utilisateur qui recherche le "gluten".

Mon code fonctionne presque sauf pour le paramètre opérateur.

Je lance cette requête:

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

Cette fonction renvoie tous les produits marqués comme requête de recherche:

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

Mais si je change l'opérateur en NOT IN, je n'obtiens aucun résultat:

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

Les produits sont correctement étiquetés et il existe des produits sans l’étiquette gluten

2
NiloVelez

Je suppose que vous avez besoin d’un tableau pour les termes - bien que je ne sache pas pourquoi cela fonctionnerait avec "IN" et non avec "NOT IN" ... Mais j’essaierais ceci:

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

J'espère que cela t'aides!

4
MacPrawn