【小技】query_postsではなくpre_get_postsフィルターを使っていこう

2013年3月27日

検索しているとよく例としてあがってる関数として「query_posts」関数があると思います。
ただ、Codexには

テンプレートタグ/query_posts

「query_postsではなくpre_get_postsフィルターを用い、is_main_queryでチェックしてメインクエリーを変更することが強く推奨されています。」
と記載されています。

また、注意事項として

・query_posts()を使うと、投稿にもとづいたグローバル変数やテンプレートタグも変更されます。
query_posts()を呼び出したあとは、条件分岐タグも置き換えられてしまいます。このことが意図しない結果を引き起こすかもしれません。

・派生的な一覧を表示したい場合は、WP_Queryの新しいインスタンスを生成するか、get_postsを使ってください。
もしquery_posts()を使う場合は、用が済んだら必ずwp_reset_query()を呼び出してください。

・’paged’ クエリー引数を適切に指定していないと、ページ送りが正しく動作しない可能性があります。

・query_postsをテンプレートで使用する場合、WordPressはすでにデータベースへの問い合わせを実行し、テンプレートを読み込む頃にはデータの取り出しを終えています。
そのため、query_posts()を使ってデフォルトのクエリーを上書きして結果を得るには、どうしても再度データベースに問い合わせし再計算する必要があります。

が列挙されています。

1~3までの項目に関しては、どれだけの影響があるのかは、文章では分からないですが
ただ、4番目のデータベースへの再問合せとなるとボディブローのようにじんわり利いてくると思います。
本来なら1回で済むデータベースへのアクセスが1回余分に発生すると言う事になります。

100回該当ページを読み込んだとすると100回+100回=200回データベースへのアクセスが発生します。
余分にアクセスすると言う事は、当然ながら表示速度にも影響を与えます。

なので、これからは、query_posts()を使っていた場面では、pre_get_postsで、できるかどうかをまず考える。
それが無理であった場合には、query_posts()を含めた他の方法を採用するという流れが自然かなと思います。

本ページはアフィリエイトプログラムによる収益を得ています

小技集

Posted by 管理人