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

16

Hay una manera de usar $query->set('tax_query', ...)en el pre_get_postsfiltro? por ejemplo, el siguiente código no está alterando la consulta. Tenga en cuenta que estoy creando $ taxonomías a partir de una búsqueda personalizada.

function custom_search_filter($query) {
        ...

        // array('taxonomy' => 'category', 'field' => 'id', 'terms' => array( 41,42 ), 'operator' => 'IN')
        $taxonomies = implode(',', $taxonomy_arr);

        // /wordpress/25076/how-to-filter-wordpress-search-excluding-post-in-some-custom-taxonomies

        $taxonomy_query = array('relation' => 'AND', $taxonomies);

        $query->set('tax_query', $taxonomy_query);
    }

    return $query; 
}


add_filter( 'pre_get_posts', 'custom_search_filter', 999 );

Gracias por adelantado.

José Pablo Orozco Marín
fuente
1
¿Por qué pasa un WP_Queryobjeto a un método de configuración de argumentos?
t31os
Sí, estaba equivocado, ahora lo obtuve usando eval para convertir la cadena en una matriz (y estoy realmente seguro de que la cadena es segura). Gracias.
José Pablo Orozco Marín

Respuestas:

35

La $queryvariable en el filtro representa un WP_Queryobjeto, por lo que no debería pasar un nuevo WP_Queryobjeto al método para establecer las propiedades de ese objeto.

La pregunta de la que copió el código estaba usando incorrectamente el filtro, que creo que es el quid de su problema.

Sí, tax_queryse puede usar dentro de un filtro / acción pre_get_posts(o similar parse_request).

Aquí hay un ejemplo:
especifique una taxonomía personalizada para consultas de búsqueda

function search_filter_get_posts($query) {
    if ( !$query->is_search )
        return $query;

    $taxquery = array(
        array(
            'taxonomy' => 'career_event_type',
            'field' => 'id',
            'terms' => array( 52 ),
            'operator'=> 'NOT IN'
        )
    );

    $query->set( 'tax_query', $taxquery );

}
add_action( 'pre_get_posts', 'search_filter_get_posts' );
t31os
fuente
66
¿podría dar un ejemplo de trabajo de establecer tax_query dentro de una acción pre_get_posts?
helgatheviking
$ tax_query es un objeto que contiene una matriz anidada. No puede anular el objeto con una matriz anidada.
AlxVallejo
3
$tax_queryno es un objeto, $queryes (es una instancia de WP_Query).
t31os
2
¿Esto no anula por completo el tax_query? ¿No se debe agregar $ taxquery a los datos actuales en el argumento tax_query?
hot_barbara
@hot_barbara tal como está, sobrescribirá tax_query. Esta versión agregaría la consulta actual en su lugar: $ taxquery = array ('relación' => 'OR', matriz ('taxonomía' => 'carrera_event_tipo', 'campo' => 'id', 'términos' => matriz ( 52), 'operador' => 'NO EN'));
rambillo hace