web-dev-qa-db-fra.com

Comment exclure les termes de la requête principale de la manière la plus performante?

Ce Q est un suivi de cette réponse sur le Q: "Comment exclure un terme spécifique pour la recherche ? " .

4 façons de filtrer les publications qui ont un terme spécifique

Type                | Pro                   | Contra
--------------------------------------------------------
Run a new query     | Easy to implement     | Add. Queries
                                            | Add. time to execute the DB call + processing the parsing of the results
Inside the loop     | Easy to implement     | Sometimes Add. Queries
                                            | Add. time to execute
Modify the query    | Full control          | Hard to implement
                                            | Needs a lot of knowledge (preparing, DB interaction)
Add new query parts | No perform. impact    | Hard to get around
                    | Secure
                    | Full core support

Le premier type imho n'est pas une option. Les "Types" 2 et 3 ont déjà reçu une réponse dans l'autre Q et tous les deux ont encore des tirages en arrière.

Question:

  1. Comment ajouter un argument tax_query supplémentaire à la requête principale en utilisant (par exemple) le filtre pre_get_posts?
  2. Connaissez-vous d'autres moyens de modifier la requête principale?
4
kaiser

Vous pouvez définir la requête de taxonomie pour la requête principale à l'aide de pre_get_posts:

add_action( 'pre_get_posts', 'my_exclude_terms_from_query' );
function my_exclude_terms_from_query( $query ) {
    if ( $query->is_main_query() /* && whatever else */ ) {
        $tax_query = array (
                array(
                    'taxonomy' => 'category',
                    'terms' => array( 'cat-slug' ),
                    'field' => 'slug',
                    'operator' => 'NOT IN',
                )
        );
        $query->set( 'tax_query', $tax_query );
    }
}

Si tax_query est déjà défini et que vous devez le modifier à la place, vous pouvez extraire puis ajouter au tableau $tax_query.

6
helenhousandi