robou55’s diary

http://d.hatena.ne.jp/robou55/ のつづき

はまった

のは、WP_reset_query();をいれるところ。
Wordpressの最近のテンプレートでは、ページを表示するときもループを回しているので、query環境変数を途中で変えるような操作をするとその後の表示がおかしくなる。

上の例だと、WP_reset_query();を入れないと最後に指定しているカテゴリーの記事一覧がページの末尾に表示されてしまう(ページテンプレートの働き)。

複数の独立したループをつくるための方法を検索したら、
1. get_posts()を使う
2. $temp_query = clone $wp_query などとして一旦変数を待避させてループ後に戻す
3. $local_query = New WP_query(); を利用して新たな変数をつける
といった三つのパターンがあった。結論としてはどれもダメ。

1は正攻法らしく、上手く動くが、パーマリンクを取得しようと思うとget_posts()の引数の範囲ではできない用で、結局グローバル変数への値の読み込みを行うため、普通にqueryをかけるのと同じになってしまう。
2は、試した範囲ではどうもうまくいかない。
3は、一見、まともだった(のでfirst versionはこの方式でアップロードしていた)が、よく見ると、なぜか一番最後の記事の情報が引き継がれていたようで、コメント欄などが表示され、本来、ページの編集へ飛ぶはずの[edit]リンクが、最後の記事へのリンクになっていた。

結局、WP_reset_query();をいれるのがベスト、ということを見つけるのに三日かかってしまった。