WordPressWordPressを使用していてループを実現する時にquery_postsを使うことは多いかと思われます。最近ではquery_postsを使うのはあまり良くないと言われている。ある構成として以下のようなサイトがあるとする。お問い合わせ」「ブログ一覧」の5つのページをすべて固定ページとして作っておく。「ブログ一覧」ページの中でquery_postsを使ってループとページング(正式にはページネーションと言うらしい)をすることが考えられる。?>実際、私もちょっと前まで上のようにやっていた。(2013年8月発売)これらの本では上記のように固定ページでquery_postsを使用していた。2015年現在ではこのやり方はあまり良くないらしい。いうよりも、そもそもquery_postsを使うこと自体が良くないと言われている。そんなこんなで、フォーラムにもたびたび投稿されるquery_posts由来のトラブル。query_posts狂想曲。引用元:query_postsを捨てよ、pre_get_postsを使おう【追記あり】【報告あり】お祭り好きなこの私も当然ながらこの騒ぎに参加し、以下のようなことを言いながらどんちゃん騒ぎをしたものだ。ページングが正常に機能しない。query_postsの引数にarrayの配列形式だとどう書けばいいの?一つのページ内にループを2つ作ると、2つめがおかしくなる。そもそもメインループとかメインクエリって何だよ?そんなことを言いながら多くのサイトを見て回って調べた結果、上記の問題点はすべて解決でき、query_postsを使ってのループ表示やページ送りは固定ページやアーカイブページでも正常に行うことができていた。!正常に表示や機能をしていても、query_postsの問題点はまだあった。query_postsがよくない理由:データベースの重複読み込みWordPressの仕組みでは、読み込まれるURLを元にそれが固定ページなのか投稿ページなのかそれともアーカイブページなのかなどを判別し、その判別を元にデータベースから該当するデータを読み出すことになる。その後に該当するテンプレートファイルを選択して画面に表示させる。日本語版つまり、query_postsが記述されているテンプレートファイルが選択される時点で、すでにデータベースのデータは読み込まれてしまっていることになる。あるから、テンプレートファイル内でquery_postsによって再びデータベースを読み込み直すのはパフォーマンス面で無駄である。get_postsでquery_postsと同じことは実現できるか?そこで私が試したのがget_postsでquery_postsと同じループ表示をできるかということである。これが実現できれば、今後はもうquery_postsを使わなくて済む。調べて試してみた結果、get_postsによってループ表示はできる。ページング(ページネーション)はできない。(私が調べた範囲では)つまりget_postsはquery_postsの完全な代替にはならないが、ページングを行わないループ表示に使うと良い。(例:このブログのサイドバーにある「最近書いた記事」のように)pre_get_postsでページング(ページネーション)を行えるか?次に私が試したのがpre_get_postsによってループ表示とページングを実現できるか、ということである。上記引用元のページや他いくつかのサイトを参考に試した結果、pre_get_postsによってループ表示とページング(ページネーション)は実現可能。'change_posts_per_page');function.phpおよびpre_get_postsフックはクエリーが実行される前に呼び出されるので、query_postsのようにデータベースの重複読み込みは発生しない。実際にpre_get_postsを使うようになると、各ページの表示数などをfunction.phpで一元管理できるのでけっこう便利である。私が思う現時点での最適解は、ページングを行うループ表示に関してはpre_get_posts。ページングを行わないループ表示に関してはget_posts。query_postsはまったく使う必要はない。注意点:pre_get_postsは固定ページでは機能しない注意点としては、pre_get_postsは固定ページでは機能しないことである。固定ページ内でループ表示とページングを行うことはできない。するか?例えば、カテゴリごとのアーカイブならcategory.phpを使えば一発ですね。月別アーカイブならdate.phpで一発です。それらを分けずにまとめてやりたいならarchive.phpだけでも良いですね。日本語版しかしここで問題になるのは、すべての投稿ページのアーカイブである。中にある「フロントページの表示」を使います。これに関しては後日また解説します。(書きました→query_postsを使わずに固定ページにすべての投稿一覧をページング表示させる方法)またはカスタム投稿タイプを使えば、archive-カスタム投稿タイプ名.phpを使うことができるので簡単です。このテンプレートファイルならば、この投稿タイプに属するすべての記事のアーカイブになります。return;}のようにis_post_type_archive()を使えば投稿タイプアーカイブページであるかどうかを判定できます。追記:このページの内容はすべて自分で調べたものなので、もし間違っている点などありましたら是非教えてください。コンビニで缶コーヒーを飲みながらタバコを吸うのが日課の暗い人。ご質問やお便りはお問い合わせページからどうぞ。企画もの(使用に注意)全国のうんこ大好きなチビッコ達が大喜び。このボタンの詳しい説明はこちら。一度押すとスタート、もう一度押すとストップ。このボタンの詳しい説明はこちら。