記事が表示されない!?WordPressの記事ループ後にやっておくべきこと
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() を使っている箇所では
必ずループ後にリセットを忘れないようにしましょう。