記事が表示されない!?WordPressの記事ループ後にやっておくべきこと

テーマ

wptheme_queryp_reset

WordPressテーマを作成している際、慣れないうちは問題にぶつかることが多々ありますが
その内の1つにページ内での複数の記事ループがあるのではないでしょうか。

たとえると、

  • 固定ページの上に 新着記事一覧 を表示する
  • その下に 固定ページの本文 を表示する

こんなパターンです。ブログでよく見かける形式ですね。
両方に query_posts() を使っていると、この問題にぶち当たってしまいます。
固定ページの本文が表示されなかったり。。

複数ループを使いたい場合は、本来の使い方通りに get_posts() を使えば済む話ですが、
どうしても query_posts() を使いたいことってあると思います。

今回は query_posts() を使った複数回記事ループの方法を紹介します。

query_posts() を使って複数回記事のループをさせる方法

query_posts() 記事を取得するテンプレートタグです。よく似たタグの get_posts() と違い、メインクエリを上書きする仕様です。上書きしたらリセットしましょう。
wp_reset_query() 変更されたメインクエリを元あったデータに戻します。query_posts() の後で使います。
<!-- 新着記事一覧 -->
<ul>

<?php query_posts('cat=1&showposts=5');?>
<?php if ( have_posts() ): while ( have_posts() ): the_post(); ?>

	<li><a href="<?php the_permalink();?>"><?php the_title();?></a></li>

<?php endwhile;
endif;

// ここでメインクエリを元のデータへリセットします
wp_reset_query(); ?>

</ul>

<!-- 固定ページ本文 -->
<h1><?php single_post_title() ?></h1>

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>

<div class="entry">
	<?php the_content(); ?>
</div>

<?php endwhile; endif; ?>

query_posts() はメインクエリを上書きする仕様です。

上の例で言うと、
query_posts が「新着記事一覧」のデータを上書きしたことで
元あったはずの「固定ページ本文」が塗りつぶされ、表示されなくなったのです。

この塗りつぶしてしまった「固定ページ本文」を元に戻すために、
メインクエリをリセットしてくれる wp_reset_query() を使います。

固定ページに限らず、複数 query_posts() を使っている箇所では
必ずループ後にリセットを忘れないようにしましょう。

テーマ

関連記事