L'operatore "NOT IN" non funziona in tax_query - Problemi con WooCommerce

13 feb 2017, 16:14:06
Visualizzazioni: 16.1K
Voti: 4

Sto cercando di modificare la funzionalità di ricerca di un negozio WooCommerce in modo che quando un utente cerca una query che corrisponde a uno slug di product_tag, vengano restituiti i prodotti che non hanno quel tag assegnato.

La logica è mostrare tutti i prodotti senza glutine a un utente che cerca "glutine".

Il mio codice funziona quasi perfettamente, tranne che per il parametro operator.

Sto eseguendo questa query:

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

Questa funzione restituisce tutti i prodotti taggati con la query di ricerca:

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

Ma se cambio l'operatore in NOT IN, non ottengo alcun risultato:

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

I prodotti sono correttamente taggati e ci sono prodotti senza il tag glutine

0
Tutte le risposte alla domanda 2
4

Sospetto che tu abbia bisogno di un array per i termini - anche se non sono sicuro del perché funzioni con "IN" e non con "NOT IN"... Ma proverei questo:

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

Spero che questo ti aiuti!

13 feb 2017 23:12:04
Commenti

Grazie, ma ho appena provato e la query ancora non restituisce risultati

NiloVelez NiloVelez
14 feb 2017 09:41:32

Mmmh. Ok. In passato, a volte ho dovuto anche aggiungere $query->set('tax_query', $query->tax_query->queries); -- vedi la mia risposta aggiornata.

nibnut nibnut
14 feb 2017 12:42:15

Potresti anche fare debug della query per vedere cosa WP costruisce dal tuo filtro: https://codex.wordpress.org/Editing_wp-config.php#Save_queries_for_analysis

nibnut nibnut
14 feb 2017 12:43:33

Ottengo risultati incoerenti, ma almeno ho una base per il debug delle query. Accetto la tua risposta poiché ulteriori problemi potrebbero essere causati da fattori esterni, grazie per il tuo aiuto.

NiloVelez NiloVelez
15 feb 2017 16:28:15
1

Per integrare la risposta di @nibnut, consiglio di verificare prima se esiste già una tax_query nella Query, in modo da non sovrascriverla:

$query->tax_query->queries      = (array) $query->get( 'tax_query' );
9 giu 2022 07:00:38
Commenti

Questa non fornisce una risposta alla domanda. Una volta che avrai abbastanza reputazione potrai commentare qualsiasi post; invece, fornisci risposte che non richiedano chiarimenti da parte di chi ha posto la domanda. - Da Revisione

vancoder vancoder
10 giu 2022 00:11:03