1. WordPress

【WordPress】wp_reset_postdata() と wp_reset_query() の違いを理解しよう

Share

カスタムクエリやループを扱っているとき、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() は、WP_Query を使ったあとに使うのが基本
  • wp_reset_query() は、query_posts() を使った場合に必要(ただし非推奨)
  • 混同するとバグの原因になるので、ループの種類に応じて正しく使い分けることが重要

WordPressの開発でループを扱う機会は多いため、この2つの関数の違いをしっかり理解しておくと、より安定したテーマ・プラグイン開発が可能になります。