私は今日、 query_posts()のドキュメント がメインループを変更するためにquery_postsを使用することのいくつかの「不利な点」に言及していることに気づきました。
これは別の方法/より良い方法があることを暗示しているようです。明らかに二次ループのためのget_posts()とWP_Queryがありますが、私はそれらがCodexドキュメンテーションにリストされた「不利な点」に対処するようには見えません。
テンプレートに入ってquery_postsを実行するのを待つことで、WordPressはすでに1回クエリを実行しており、これが最初のクエリを上書きする2番目のクエリになります(最初のクエリは基本的に無視されます)。これは確かに非効率的に聞こえますか(おそらく大したことではありませんが、誰が知っているでしょうか)。
私の質問は、query_postsの代わりに "追加のSQLクエリ"を追加しないということですか。それとも、Codexのドキュメントは単に欺くのでしょうか。
私が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' );