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_relationships
o 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?
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.