カスタムクエリやループを扱っているとき、wp_reset_postdata()
と wp_reset_query()
という似た関数に出会ったことはありませんか?
どちらも「元に戻す」役割を持っていますが、使い方を間違えると表示バグや意図しない挙動の原因になります。
この記事では、この2つの関数の違いや使い分け方を実例付きで解説します。
目次
結論:役割の違いをざっくり理解しよう
関数名 | 主な用途 | 元に戻す対象 |
---|---|---|
wp_reset_postdata() | WP_Query を使ったループ後に使う | $post グローバル変数 |
wp_reset_query() | query_posts() を使ったメインクエリ変更後に使う | $wp_query 全体 |
wp_reset_postdata() とは?
概要
WP_Query
を使って新しくクエリを作成したあとに、グローバルな $post
を元に戻すために使う関数です。
よくある使用例
$the_query = new WP_Query(array('post_type' => 'news'));
if ($the_query->have_posts()) :
while ($the_query->have_posts()) : $the_query->the_post();
the_title();
endwhile;
endif;
// ここでグローバル $post を元に戻す
wp_reset_postdata();
この wp_reset_postdata()
を省略すると、ページ下部などで the_title()
や the_content()
を使ったときに、カスタムクエリの投稿が参照されてしまう可能性があります。
wp_reset_query() とは?
概要
query_posts()
関数でメインクエリを書き換えたとき、完全に元のクエリに戻すために使う関数です。
これは $wp_query
オブジェクト自体をリセットします。
使用例(非推奨なケース)
query_posts('posts_per_page=5');
if (have_posts()) :
while (have_posts()) : the_post();
the_title();
endwhile;
endif;
// 元に戻す
wp_reset_query();
💡 注意:
query_posts()
自体が推奨されていないため、基本的にはWP_Query
+wp_reset_postdata()
を使うことをおすすめします。
違いのまとめ(コードと目的)
比較項目 | wp_reset_postdata() | wp_reset_query() |
---|---|---|
対象 | $post グローバル | $wp_query グローバル |
主な使用ケース | WP_Query のループ後 | query_posts() を使用した後 |
現在のメインクエリに影響 | なし(影響しない) | あり(リセットする) |
安全性・推奨度 | 安全・推奨 | 非推奨(使用には注意が必要) |
よくある間違いと注意点
the_post()
を使ったあとにwp_reset_postdata()
をしないと、メインループ以降の出力が壊れることがあるquery_posts()
を使ってwp_reset_postdata()
を使っても無意味(この場合はwp_reset_query()
)- 可能な限り
WP_Query
+wp_reset_postdata()
を使うべき
公式ドキュメント
- wp_reset_postdata() – Developer Reference
- wp_reset_query() – Developer Reference
- WP_Query – Class Reference
まとめ
wp_reset_postdata()
は、WP_Query
を使ったあとに使うのが基本wp_reset_query()
は、query_posts()
を使った場合に必要(ただし非推奨)- 混同するとバグの原因になるので、ループの種類に応じて正しく使い分けることが重要
WordPressの開発でループを扱う機会は多いため、この2つの関数の違いをしっかり理解しておくと、より安定したテーマ・プラグイン開発が可能になります。