WP_Query()を使った後にwp_reset_postdata()を使う意味

WP_Query()で投稿のループを回した際、ループの後でwp_reset_postdata()を実行してリセットさせますが、このリセットをしなかった場合にどういったことになるのかを試してみます。

サンプルコード

例として、記事詳細ページ(記事IDは182)でWP_Query()を使う形で試してみます。
まずはwp_reset_postdata()を使用する場合です。

<div>この記事のID:<?php echo get_the_id(); ?></div>

<?php $query = new WP_Query(array(
  'post_type'      => 'post',
  'posts_per_page' => 3
)); ?>
<ul>
  <?php if($query->have_posts()): ?>
    <?php while($query->have_posts()): $query->the_post(); ?>
      <li><?php echo get_the_id(); ?></li>
    <?php endwhile; ?>
  <?php endif; wp_reset_postdata(); ?>
</ul>

<div>WP_Query()の後で再取得:<?php echo get_the_id(); ?></div>

この場合は意図した通りの動作で、WP_Query()を使用する前も後もその記事のIDが正しく取得できています。

<div>この記事のID:182</div>

<ul>
  <li>210</li>
  <li>208</li>
  <li>206</li>
</ul>

<div>WP_Query()の後で再取得:182</div>

次にwp_reset_postdata()を使用しなかった場合です。

<div>この記事のID:<?php echo get_the_id(); ?></div>

<?php $query = new WP_Query(array(
  'post_type'      => 'post',
  'posts_per_page' => 3
)); ?>
<ul>
  <?php if($query->have_posts()): ?>
    <?php while($query->have_posts()): $query->the_post(); ?>
      <li><?php echo get_the_id(); ?></li>
    <?php endwhile; ?>
  <?php endif; ?>
</ul>

<div>WP_Query()の後で再取得:<?php echo get_the_id(); ?></div>

この場合は先ほどと異なり、WP_Query()を使用した後のget_the_id()で正しい記事が取得できませんでした。

<div>この記事のID:182</div>

<ul>
  <li>210</li>
  <li>208</li>
  <li>206</li>
</ul>

<div>WP_Query()の後で再取得:206</div>

WP_Query()のループの最後の記事IDが206なのでなんとなく予想ができますが、WP_Query()でループを回した後でwp_reset_postdata()でリセットしなかった場合、その後で使用する記事情報などがWP_Query()の処理の影響を受けたままになってしまいます。
こういった意図しない挙動になるのを防ぐため、WP_Query()のループの後でwp_reset_postdata()を使ったリセットが必要になります。

参考サイト

このエントリーをはてなブックマークに追加

関連記事

コメントを残す

メールアドレスが公開されることはありません。
* が付いている欄は必須項目です

CAPTCHA


コメントが承認されるまで時間がかかります。

2024年4月
 123456
78910111213
14151617181920
21222324252627
282930