¿Hay alguna forma de usar $query->set('tax_query' en el filtro pre_get_posts?

30 nov 2011, 22:10:42
Vistas: 66.3K
Votos: 20

¿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.

2
Comentarios

¿Por qué estás pasando un objeto WP_Query a un método de configuración de argumentos?

t31os t31os
1 dic 2011 03:06:26

Sí, estaba equivocado, ahora lo solucioné usando eval para convertir la cadena en un array (y estoy realmente seguro de que la cadena es segura). Gracias.

José Pablo Orozco Marín José Pablo Orozco Marín
1 dic 2011 14:14:13
Todas las respuestas a la pregunta 2
7
43

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', '' );
1 dic 2011 15:32:04
Comentarios

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

helgatheviking helgatheviking
22 feb 2012 22:05:44

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

AlxVallejo AlxVallejo
17 abr 2013 22:11:06

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

t31os t31os
18 abr 2013 00:29:10

¿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 hot_barbara
25 may 2018 22:33:43

@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' ) );

rambillo rambillo
21 ene 2020 00:20:20

@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.

Alexander Behling Alexander Behling
22 feb 2022 11:38:59

Sin duda debería haberlo sido, he actualizado la respuesta para hacer algunas correcciones/adiciones.

t31os t31os
20 oct 2022 08:08:12
Mostrar los 2 comentarios restantes
0

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.

3 may 2013 02:17:30