【WordPress】「wp_reset_query()」と「 wp_reset_postdata()」

「wp_reset_query()」と「 wp_reset_postdata()」についての解説です。
1
Imamura @s56bouya

「wp_reset_postdata vs wp_reset_query」ってgoogleサジェストで出てきました

2013-05-14 21:26:07
Imamura @s56bouya

wp_reset_query()は、wp_reset_postdata()も呼んでるからwp_reset_query()つかっとけばOKなんですかね。http://t.co/oAQFjU4sy3

2013-05-14 21:29:42
Imamura @s56bouya

WP_Queryのあとにwp_reset_query()つかうのかwp_reset_postdata()つかうのか、何もいらないのか、両方使うのかハマってます。

2013-05-14 21:33:49
まがぞん @jim0912

@s56bouya 帰ったら、めんそんしますw

2013-05-14 21:34:42
Imamura @s56bouya

@jim0912 ほんと、恥ずかしいくらい知らなくてすいません>< 正座してます><

2013-05-14 21:35:45
まがぞん @jim0912

ただいま、ただいま。

2013-05-14 22:14:24
まがぞん @jim0912

@s56bouya というわけで、今からつらつらと書き殴ります。分からないところがあったら、適当にリプください。

2013-05-14 22:15:24
Imamura @s56bouya

@jim0912 わかりました。お願いします。

2013-05-14 22:18:51
まがぞん @jim0912

wp_reset_querywp_reset_postdata について書くよ。

2013-05-14 22:15:59
まがぞん @jim0912

少々乱暴に簡単に結果から言うと、wp_reset_query は、query_posts に対するものwp_reset_postdata は、the_post に対するものになります。

2013-05-14 22:17:48
まがぞん @jim0912

つまり、query_posts を使った場合には、wp_reset_query を使うthe_post を使った場合にはwp_reset_postdata を使うという構図になります。

2013-05-14 22:18:29
☯細谷崇@NPOのIT支援(HP制作, 業務システム開発)/WordPress/kintone @tkc49

@jim0912 ぎゃー!認識まちごうてましたT^T wp_reset_postdataはsetup postdataのときに使うものやと思ってますたT^T

2013-05-14 22:23:07
まがぞん @jim0912

@tkc49 あ、すいません。そうです。the_postは内部でsetup_postdata やってますから、その理解でも間違ってません。

2013-05-14 22:40:10
まがぞん @jim0912

※ 補足 いくつかの例では、the_post ではなく、setup_postdata を使っていたりしますが、これは、the_post の中で呼ばれる関数で、これを使用されている場合にも、wp_reset_postdata を使うようにしませう。

2013-05-14 22:41:56
まがぞん @jim0912

それぞれ、細かく説明していくことにしますが、まず、WordPress の記事の取得は、メインループもquery_posts も、get_posts も、WP_Queryも全て、WP_Query というPHPのクラスを用いています。

2013-05-14 22:20:25
まがぞん @jim0912

テンプレート上でWP_Query を使う場合、$myloop = new WP_Query(); などのように書くと思いますが、メインループとquery_posts は、この$myloop に当たる変数をグローバル変数の $wp_query を用いています。

2013-05-14 22:22:51
まがぞん @jim0912

このため、query_posts を使った場合、メインループの $wp_query が上書きされてしまいます。これが何に影響するかというと、内部では、$wp_query を参照している is_home などの条件分岐タグに影響を及ぼしてしまいます。

2013-05-14 22:24:32
まがぞん @jim0912

条件分岐タグは、サイドバーやフッターなどでも利用したりするので、途中からこの結果が変わってしまったりするのは、非常に都合が悪いことになります。この上書きされてしまった $wp_query をquery_posts 前のメインループの状態に戻すのが、wp_reset_queryです

2013-05-14 22:26:51
まがぞん @jim0912

これに対して、wp_reset_postdata は、WordPress ループ内の問題です。WordPress ループを行う際、the_post(); または、$myloop->the_post(); などを行いますが、これは、ループ内部で利用できるテンプレートタグのための

2013-05-14 22:28:56
まがぞん @jim0912

グローバル変数の生成を行っています。

2013-05-14 22:29:12
まがぞん @jim0912

例えば、メインループ内にもう一つループを作って表示したいという(めずらしい)ケースがあったとします。

2013-05-14 22:30:44
まがぞん @jim0912

この場合、メインループのthe_post 後に、サブループの the_postが行われ、メインループ用のグローバル変数が上書きされてしまいます。こうなった場合、サブループ後に再度、メインループの処理を行おうとした場合、グローバル変数がサブループのもので上書きされてしまっているため

2013-05-14 22:33:14