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.


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

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.