Operatorul "NOT IN" nu funcționează în tax_query
Î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
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ă!

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

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.

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

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
