web-dev-qa-db-ja.com

どのようにしてメインクエリから最も高性能な方法で用語を除外するか?

このQは Qのこの答え へのフォローアップです: ? " .

特定の用語を含む投稿を除外する4つの方法

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

最初のタイプimhoは、notオプションです。 "タイプ" 2と3はもう一方のQで既に答えられていて、両方ともまだいくらかの引き戻しがあります。

質問:

  1. tax_queryフィルタを使用してメインクエリに追加のpre_get_posts引数を追加する方法
  2. メインクエリを変更するための追加の方法を知っていますか?
4
kaiser

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

tax_queryが既に設定されており、代わりにそれを変更する必要がある場合は、取得して$tax_query配列に追加することができます。

6
helenhousandi