Operatorul "NOT IN" nu funcționează în tax_query

13 feb. 2017, 16:14:06
Vizualizări: 16.1K
Voturi: 4

Încerc să modific funcționalitatea de căutare a unui magazin WooCommerce astfel încât atunci când un utilizator face o căutare care se potrivește cu un slug de product_tag, să returneze produsele care nu au acel tag atribuit.

Logica din spate este să afișez toate produsele fără gluten unui utilizator care caută "gluten".

Codul meu funcționează aproape perfect, cu excepția parametrului operator.

Trimite această interogare:

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

Această funcție returnează toate produsele etichetate conform interogării de căutare:

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

Dar dacă schimb operatorul la NOT IN, nu primesc niciun rezultat:

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

Produsele sunt etichetate corect și există produse fără tag-ul gluten

0
Toate răspunsurile la întrebare 2
4

Bănuiesc că ai nevoie de un array pentru termeni - deși nu sunt sigur de ce ar funcționa cu "IN" și nu cu "NOT IN"... Dar aș încerca așa:

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', // Taxonomia pentru etichetele de produs
                'field'     => 'slug',        // Câmpul după care se filtrează
                'terms'     => array($term->slug), // Termenii de exclus (în array)
                'operator'  => 'NOT IN'       // Operatorul de excludere
        );
        $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 ); // Acțiunea care modifică query-ul înainte de preluare

Sper că te ajută!

13 feb. 2017 23:12:04
Comentarii

Mulțumesc, dar tocmai am încercat asta și interogarea încă nu returnează rezultate

NiloVelez NiloVelez
14 feb. 2017 09:41:32

Hmmm. Ok. Ei bine, în trecut, uneori a trebuit să adaug și $query->set('tax_query', $query->tax_query->queries); -- vezi răspunsul meu actualizat.

nibnut nibnut
14 feb. 2017 12:42:15

Ai putea de asemenea să depanezi interogarea pentru a vedea ce construiește WP pe baza filtrului tău: https://codex.wordpress.org/Editing_wp-config.php#Save_queries_for_analysis

nibnut nibnut
14 feb. 2017 12:43:33

Am rezultate inconsistente, dar cel puțin am o bază pentru depanarea interogărilor. Voi marca răspunsul tău ca acceptat deoarece problemele ulterioare pot fi cauzate de factori externi, mulțumesc pentru ajutor.

NiloVelez NiloVelez
15 feb. 2017 16:28:15
1

Doar pentru a completa răspunsul lui @nibnut, recomand să verificați mai întâi dacă există vreun tax_query în interogare, astfel încât să nu le suprascrieți:

$query->tax_query->queries      = (array) $query->get( 'tax_query' );
9 iun. 2022 07:00:38
Comentarii

Acest lucru nu oferă un răspuns la întrebare. Odată ce ai suficientă reputație, vei putea să comentezi la orice postare; în schimb, oferă răspunsuri care nu necesită clarificări din partea celui care a întrebat. - Din Recenzie

vancoder vancoder
10 iun. 2022 00:11:03