【WordPress】「wp_reset_query()」と「 wp_reset_postdata()」
wp_reset_query()は、wp_reset_postdata()も呼んでるからwp_reset_query()つかっとけばOKなんですかね。http://t.co/oAQFjU4sy3
2013-05-14 21:29:42WP_Queryのあとにwp_reset_query()つかうのかwp_reset_postdata()つかうのか、何もいらないのか、両方使うのかハマってます。
2013-05-14 21:33:49少々乱暴に簡単に結果から言うと、wp_reset_query は、query_posts に対するもの、wp_reset_postdata は、the_post に対するものになります。
2013-05-14 22:17:48つまり、query_posts を使った場合には、wp_reset_query を使う、the_post を使った場合には、wp_reset_postdata を使うという構図になります。
2013-05-14 22:18:29@jim0912 ぎゃー!認識まちごうてましたT^T wp_reset_postdataはsetup postdataのときに使うものやと思ってますたT^T
2013-05-14 22:23:07@tkc49 あ、すいません。そうです。the_postは内部でsetup_postdata やってますから、その理解でも間違ってません。
2013-05-14 22:40:10※ 補足 いくつかの例では、the_post ではなく、setup_postdata を使っていたりしますが、これは、the_post の中で呼ばれる関数で、これを使用されている場合にも、wp_reset_postdata を使うようにしませう。
2013-05-14 22:41:56それぞれ、細かく説明していくことにしますが、まず、WordPress の記事の取得は、メインループもquery_posts も、get_posts も、WP_Queryも全て、WP_Query というPHPのクラスを用いています。
2013-05-14 22:20:25テンプレート上でWP_Query を使う場合、$myloop = new WP_Query(); などのように書くと思いますが、メインループとquery_posts は、この$myloop に当たる変数をグローバル変数の $wp_query を用いています。
2013-05-14 22:22:51このため、query_posts を使った場合、メインループの $wp_query が上書きされてしまいます。これが何に影響するかというと、内部では、$wp_query を参照している is_home などの条件分岐タグに影響を及ぼしてしまいます。
2013-05-14 22:24:32条件分岐タグは、サイドバーやフッターなどでも利用したりするので、途中からこの結果が変わってしまったりするのは、非常に都合が悪いことになります。この上書きされてしまった $wp_query をquery_posts 前のメインループの状態に戻すのが、wp_reset_queryです
2013-05-14 22:26:51これに対して、wp_reset_postdata は、WordPress ループ内の問題です。WordPress ループを行う際、the_post(); または、$myloop->the_post(); などを行いますが、これは、ループ内部で利用できるテンプレートタグのための
2013-05-14 22:28:56この場合、メインループのthe_post 後に、サブループの the_postが行われ、メインループ用のグローバル変数が上書きされてしまいます。こうなった場合、サブループ後に再度、メインループの処理を行おうとした場合、グローバル変数がサブループのもので上書きされてしまっているため
2013-05-14 22:33:14