El operador "NOT IN" no funciona en tax_query

13 feb 2017, 16:14:06
Vistas: 16.1K
Votos: 4

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.

0
Todas las respuestas a la pregunta 2
4

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!

13 feb 2017 23:12:04
Comentarios

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

NiloVelez NiloVelez
14 feb 2017 09:41:32

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.

nibnut nibnut
14 feb 2017 12:42:15

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

nibnut nibnut
14 feb 2017 12:43:33

Estoy obteniendo resultados inconsistentes, pero al menos tengo una base para depurar consultas. Marco tu respuesta como aceptada ya que otros problemas podrían deberse a factores externos, gracias por tu ayuda.

NiloVelez NiloVelez
15 feb 2017 16:28:15
1

Para complementar la respuesta de @nibnut, recomiendo verificar primero si existe algún tax_query en la Consulta, para no sobrescribirlos:

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

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

vancoder vancoder
10 jun 2022 00:11:03