El operador "NOT IN" no funciona en tax_query
Estoy intentando modificar la funcionalidad de búsqueda de una tienda WooCommerce para que cuando un usuario busque un término que coincida con un slug de product_tag
, devuelva los productos que no tienen esa etiqueta asignada.
La lógica detrás de esto es mostrar todos los productos sin gluten a un usuario que busque "gluten".
Mi código casi funciona excepto por el parámetro del operador.
Estoy lanzando esta consulta:
http://example.com/?s=gluten
Esta función devuelve todos los productos etiquetados con el término de búsqueda:
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 );
Pero si cambio el operador a NOT IN, no obtengo resultados:
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 );
Los productos están correctamente etiquetados, y hay productos sin la etiqueta gluten.
Sospecho que necesitas un array para los términos - aunque no estoy seguro por qué funcionaría con "IN" y no con "NOT IN"... Pero probaría esto:
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', // Taxonomía
'field' => 'slug', // Campo
'terms' => array($term->slug), // Términos (array)
'operator' => 'NOT IN' // Operador
);
$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 );
¡Espero que esto ayude!

Gracias, pero acabo de intentarlo y la consulta aún no devuelve resultados

Mmm. Ok. Bueno, en el pasado, a veces también he tenido que agregar $query->set('tax_query', $query->tax_query->queries);
-- mira mi respuesta actualizada.

También podrías depurar la consulta para ver qué construye WP con tu filtro: https://codex.wordpress.org/Editing_wp-config.php#Save_queries_for_analysis

Esto no proporciona una respuesta a la pregunta. Una vez que tengas suficiente reputación podrás comentar cualquier publicación; en su lugar, proporciona respuestas que no requieran aclaración del que pregunta. - Desde la Revisión
