it-swarm.com.de

Der Operator "NOT IN" funktioniert nicht in tax_query

Ich versuche, die Suchfunktion eines WooCommerce-Shops zu ändern. Wenn ein Benutzer eine Abfrage erstellt, die einem product_tag-Slug entspricht, werden die Produkte zurückgegeben, denen dieses Produkt-Tag nicht zugewiesen ist.

Die Logik dahinter ist, einem Benutzer, der nach "Gluten" sucht, alle Produkte ohne Gluten anzuzeigen.

Mein Code funktioniert fast bis auf den Parameter operator .

Ich werfe diese Abfrage:

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

Diese Funktion gibt alle Produkte zurück, die als Suchabfrage markiert sind:

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

Aber wenn ich den Operator auf NOT IN ändere, erhalte ich keine Ergebnisse:

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

Die Produkte sind korrekt markiert, und es gibt Produkte ohne gluten

2
NiloVelez

Ich vermute, Sie brauchen ein Array für die Begriffe - obwohl ich nicht sicher bin, warum es mit "IN" und nicht mit "NOT IN" funktionieren würde ... Aber ich würde Folgendes versuchen:

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

Hoffe das hilft!

4
MacPrawn