L'operatore "NOT IN" non funziona in tax_query - Problemi con WooCommerce
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
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!

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

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

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

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
