Usar tax_query crea un 0 = 1 en $wp_query->request

3 minutos de lectura

Este es mi primer intento de modificar la consulta principal usando el pre_get_posts acción/filtro

Esta es la función actualmente enganchada a él:

function advanced_product_search_filter($query)
{
  if(!is_admin() &&
     is_main_query() && 
     is_search() && $query->query_vars['post_type'] == 'product')
  {
    $keyword = $_GET['s'];

    if($_GET['exactly'])
      $keyword = $_GET['s'] . ' "'. $_GET['exactly'] . '"';

    if($_GET['without'])
    {
      $excluded = exclude_product_keyword_search($_GET['without'], 
                    $_GET['pname'],
                    $_GET['pcode']
                  );
      $query->set('post__not_in', $excluded);
    }

    if($_GET['pname'])
      $query->set('s', $keyword);
    else
      $query->set('s', '');

    if($_GET['pcode'])
    {
      $tax_queries = $query->get('tax_query');
      $tax_queries[] = array(
        array(
          'taxonomy' => 'pa_ordering-code',
          'field' => 'name',
          'terms' => array($keyword),
          'operator' => 'LIKE'
        )
      );
      $query->set('tax_query', $tax_queries);
    }
  }
}

Este es un complemento construido sobre un WooCommerce instalación. Así que básicamente esta función intentos para apoyar la búsqueda de un WooCommerce producto ya sea a través de la búsqueda estándar (título y contenido) o una búsqueda de atributo en un atributo personalizado llamado Ordering Code cual es pa_ordering-code en el term_taxonomy mesa

Otras partes del código funcionan bien, puedo modificar el s y post__not_in vars sin ningún problema, pero si trato de usar el tax_query la consulta parece fallar.

Para darte una idea, cuando pruebo esto:

?s=foo&post_type=product&pname=1&pcode=1&without=non&exactly=foo+bar

tirando el WHERE cláusula, veo esto:

AND wp_posts.ID NOT IN (219) 
AND 0 = 1 
AND 
(
  (
    (wp_posts.post_title LIKE '%foo%') OR 
    (wp_posts.post_content LIKE '%foo%')
  ) AND (
    (wp_posts.post_title LIKE '%foo bar%') OR 
    (wp_posts.post_content LIKE '%foo bar%')
  )
) 
AND wp_posts.post_type="product" 
AND (wp_posts.post_status="publish" OR wp_posts.post_status="private") 
AND
( 
  (
    wp_postmeta.meta_key = '_visibility' AND
    CAST(wp_postmeta.meta_value AS CHAR) IN ('visible','search')
  ) 
)

Observe la AND 0 = 1? Cuando tiro el JOIN cláusula, me aseguro de que la tax_query el parámetro no se interpreta correctamente ya que solo veo el postmeta mesa ahí. No terms, term_relationshipso term_taxonomy mesa.

Y también intenté simplemente sobrescribir el existente tax_query (si hay uno) haciendo esto:

$args = array(
  array(
    'taxonomy' => 'pa_ordering-code',
    'field' => 'name',
    'terms' => array($keyword),
    'operator' => 'LIKE'
  )
);
$query->set('tax_query', $args);

Pero todavía no pude hacerlo funcionar. ¿Alguna idea de lo que puedo estar haciendo mal?

Avatar de usuario de Karel Škopek
Karel Skopek

Ajuste incluir_niños parámetro a falso resolvió mi problema:

$args = array(
  array(
    'taxonomy' => 'taxonomy-name',
    'field' => 'id',
    'terms' => array(1, 2, 3, 4),
    'include_children' => false,
    'operator' => 'AND'
  )
);

El error parece ocurrir cuando hay términos anidados en tax_query (por ejemplo, 2 es hijo de 1).

Esto suele suceder cuando la taxonomía o el parámetro de taxonomía por el que busca no existe. Por ejemplo, el nombre de la taxonomía tiene un error ortográfico o el nombre del slug si está buscando por slug. En este caso, es difícil de decir ya que reescribió la consulta de taxonomía.

¿Ha sido útil esta solución?