タグ別アーカイブ: wp_reset_postdata

wordpressのsingle.phpとかでquery_postsを自前で実行した後に元のpostを参照したかった

wordpressのsingle.phpとかでquery_postsを自前で実行した後に元のpostを参照したかった。

どういうことかというと、single.phpの中で以下のような順序で上から順にpost(ID=123)にアクセスしてた。

  1. post ID=123のタイトル
  2. post ID=123の内容
  3. 関連記事の表示のため、query_posts(array(‘post__in’)); を実行
  4. while(have_posts()) the_post(); をして関連記事のタイトルを表示
  5. post ID=123のコメントを表示したい!! <– ココ重要

最後のコメントを表示しようとするとうまくいかない。というのもその前段階の関連記事表示でthe_postをしてしまっているのでグローバル変数の$postが関連記事のものになっている。なのでコメントを表示しようとしたときに利用されるpostは関連記事の一番最後のpost、while(have_posts())が回りきった最後のpostとなってしまうのだ。

試しに echo $post->ID; すると確かにIDは123でなく関連記事の最後のpost_IDになっている。

さて困ったぞ、ということでググってたらコレを解決してくれるような関数を発見。

Function Reference/wp reset postdata » WordPress Codex

以前は$post->IDを変数に保存しておいてquery_postをかまして・・・、ってやってたんだけど、このwp_reset_postdataを使えばその手間が省ける・・・、かどうかは微妙かもしれない。結局同じような手立てに。

でも標準で用意されてるってことは今後に期待もしていいってことで利用してみる。

仕組みは単純でその使用方法で示唆されている。使い方はグローバルの$wp_queryを一時待避させておいて必要になったら戻す,というもの。

$original_query = $wp_query;

 query_posts(‘hogehoge’);

$wp_query = $original_query;

 wp_reset_postdata();

the_title(); comment_template();

コレでうまくいくようになった。