web-dev-qa-db-ja.com

メインループのquery_postsの代わりに?

可能な重複:
いつWP_query()、query_posts()およびpre_get_postsを使用するか

私は今日、 query_posts()のドキュメント がメインループを変更するためにquery_postsを使用することのいくつかの「不利な点」に言及していることに気づきました。

これは別の方法/より良い方法があることを暗示しているようです。明らかに二次ループのためのget_posts()とWP_Queryがありますが、私はそれらがCodexドキュメンテーションにリストされた「不利な点」に対処するようには見えません。

テンプレートに入ってquery_postsを実行するのを待つことで、WordPressはすでに1回クエリを実行しており、これが最初のクエリを上書きする2番目のクエリになります(最初のクエリは基本的に無視されます)。これは確かに非効率的に聞こえますか(おそらく大したことではありませんが、誰が知っているでしょうか)。

私の質問は、query_postsの代わりに "追加のSQLクエリ"を追加しないということですか。それとも、Codexのドキュメントは単に欺くのでしょうか。

15
Tom Auger

私がCodexに欠点を追加したとき、私はquery_posts()の代わりに 'request'フィルタを使うことを主に考えていました。

このフィルタはメインクエリに対してのみ実行されるので、すべてのクエリに対して発生する 'pre_get_posts'の問題を解決します。

欠点は、is_single()などのようなクエリフラグにアクセスできないということです。

実際にSQLクエリを実行しなくても、これらにアクセスできる1つの方法があります。

function alter_the_query( $request ) {
    $dummy_query = new WP_Query();  // the query isn't run if we don't pass any query vars
    $dummy_query->parse_query( $request );

    // this is the actual manipulation; do whatever you need here
    if ( $dummy_query->is_home() )
        $request['category_name'] = 'news';

    return $request;
}
add_filter( 'request', 'alter_the_query' );
19
scribu