Il existe un moyen d'utiliser $ query-> set ('tax_query' dans le filtre pre_get_posts?

16

Theres un moyen d'utiliser $query->set('tax_query', ...)dans le pre_get_postsfiltre? par exemple, le code suivant ne modifie pas la requête. Notez que je construis des $ taxonomies et une recherche personnalisée.

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

Merci d'avance.

José Pablo Orozco Marín
la source
1
Pourquoi passez-vous un WP_Queryobjet dans une méthode de définition d'argument?
t31os
Oui, j'avais tort, maintenant je l'ai obtenu en utilisant eval pour convertir la chaîne en un tableau (et je suis vraiment sûr que la chaîne est sûre). Merci.
José Pablo Orozco Marín

Réponses:

35

La $queryvariable dans le filtre représente un WP_Queryobjet, vous ne devez donc pas passer un nouvel WP_Queryobjet dans la méthode de définition des propriétés de cet objet.

La question à partir de laquelle vous avez copié du code n'utilisait pas correctement le filtre, ce qui, à mon avis, est au cœur de votre problème.

Oui, tax_querypeut être utilisé à l'intérieur d'un filtre / action pre_get_posts(ou similaire parse_request).

Voici un exemple:
Spécifiez une taxonomie personnalisée pour les requêtes de recherche

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
la source
6
pourriez-vous donner un exemple pratique de définition de tax_query dans une action pre_get_posts?
helgatheviking
$ tax_query est un objet qui contient un tableau imbriqué. Vous ne pouvez pas remplacer l'objet par un tableau imbriqué.
AlxVallejo
3
$tax_queryn'est pas un objet, $querybien que (c'est une instance de WP_Query).
t31os
2
cela ne remplace-t-il pas complètement le tax_query? ne devrait pas $ taxquery être ajouté aux données actuelles dans l'argument tax_query?
hot_barbara
@hot_barbara en l'état, il écraserait la requête tax_query. Cette version ajouterait la requête actuelle à la place: $ taxquery = array ('relation' => 'OR', array ('taxonomy' => 'carrière_event_type', 'field' => 'id', 'terms' => array ( 52), 'operator' => 'NOT IN'));
rambillo