¿Hay alguna forma de usar $query->set('tax_query' en el filtro pre_get_posts?
¿Hay alguna forma de usar $query->set('tax_query', ...)
en el filtro pre_get_posts
? Por ejemplo, el siguiente código no está alterando la consulta. Ten en cuenta que estoy construyendo $taxonomies desde una búsqueda personalizada.
function custom_search_filter($query) {
...
// array('taxonomy' => 'category', 'field' => 'id', 'terms' => array( 41,42 ), 'operator' => 'IN')
$taxonomies = implode(',', $taxonomy_arr);
// https://wordpress.stackexchange.com/questions/25076/how-to-filter-wordpress-search-excluding-post-in-some-custom-taxonomies
// Cómo filtrar la búsqueda de WordPress excluyendo posts en algunas taxonomías personalizadas
$taxonomy_query = array('relation' => 'AND', $taxonomies);
$query->set('tax_query', $taxonomy_query);
}
return $query;
}
add_filter( 'pre_get_posts', 'custom_search_filter', 999 );
Gracias de antemano.

La variable $query
en el filtro representa un objeto WP_Query
, por lo que no deberías pasar un nuevo objeto WP_Query
al método para establecer las propiedades de ese objeto.
La pregunta de la que copiaste el código estaba usando incorrectamente la acción, lo que pudo haber sido el núcleo de tu problema.
Sí, se puede usar tax_query
dentro de una acción pre_get_posts
o de manera similar enganchando parse_request
, request
o parse_query
.
Aquí hay un ejemplo:
Especificar una taxonomía personalizada para consultas de búsqueda
function search_filter_get_posts( $query ) {
if( !$query->is_search || is_admin() )
return;
$taxquery = array(
array(
'taxonomy' => 'career_event_type',
'field' => 'term_id',
'terms' => array( 35, 19, 6 ),
'operator'=> 'IN'
)
);
$query->set( 'tax_query', $taxquery );
}
add_action( 'pre_get_posts', 'search_filter_get_posts' );
Aunque cabe señalar que una mayor especificidad con tus parámetros condicionales podría ayudar a evitar hacer alteraciones en consultas que no tienes intención de modificar.
Por ejemplo, si estás utilizando un formulario de búsqueda personalizado para buscar en un tipo de entrada personalizado, incluir un campo oculto (o incluso un cuadro de selección) para establecer el post_type
ayudaría a proporcionar una especificidad condicional adicional.
<input type="hidden" name="post_type" id="post_type" value="my_post_type" />
El ejemplo anterior de acción/filtro pre_get_posts
(o equivalente) tendría entonces más información para validar que estamos modificando el tipo correcto de solicitud/consulta.
'my_post_type' === $query->query['post_type']
o
'my_post_type' === get_query_var( 'my_post_type' )
Podrías ir más allá y usar un parámetro de variable de consulta que no esperes en la consulta de búsqueda y que WordPress admita, solo para actuar como una bandera para tu acción/filtro.
<input type="hidden" name="author_name" id="author_name" value="my_special_guy" />
Esto proporciona otro parámetro condicional para que tu acción busque, y simplemente puedes eliminar el valor antes de que llegue a la consulta.
set_query_var( 'author_name', '' );

¿podrías dar un ejemplo funcional de cómo establecer tax_query dentro de una acción pre_get_posts?

$tax_query es un objeto que contiene un array anidado. No puedes sobrescribir el objeto con un array anidado.

$tax_query
no es un objeto, $query
sí lo es (es una instancia de WP_Query
).

¿esto no anula completamente el tax_query? ¿no se debería añadir $taxquery a los datos actuales en el argumento tax_query?

@hot_barbara tal como está, sobrescribiría el tax_query. Esta versión añadiría la consulta actual en su lugar: $taxquery = array( 'relation' => 'OR', array( 'taxonomy' => 'career_event_type', 'field' => 'id', 'terms' => array( 52 ), 'operator'=> 'NOT IN' ) );

@t31os ¿No deberían los valores de la clave del array "field" ser "term_id" en lugar de "id"? Según https://developer.wordpress.org/reference/classes/wp_query/#taxonomy-parameters, los valores posibles son 'term_id', 'name', 'slug' o 'term_taxonomy_id'. El valor por defecto es 'term_id'. El valor 'id' no aparece ahí en absoluto.

Las consultas de impuestos requieren que también establezcas el objeto tax_query en la consulta, ya que la consulta ya ha sido analizada. Consulta mi respuesta para Modificar páginas de taxonomía para excluir elementos en taxonomías secundarias.
