WordPressの必須関数query_postsを使う場合はリセットを忘れずに

2012-11-26

WordPressは投稿や固定ページ(以下投稿に省略)に登録しておいた情報を呼び出して表示しますので、
投稿を呼び出さない事には何も始まりません。

投稿を呼び出すのにも色々パターンがあるかと思います。
投稿を1つ取得したいのか、一覧で取得したいのか、カテゴリーを限定して取得したいのか、などなど。
この辺は別の機会にまとめるとして、query_postsを使う場合の注意事項をメモしておきます。

query_postsの基本的な使い方

例えばカテゴリーIDが1,2,3の投稿を取得する場合、下記のような書き方をします。
どういう条件で投稿を取得するかを指定して、投稿を取得して、ループで1投稿ずつ処理していく、という流れです。
<?php
//条件
$args = array(
'cat' => 1,2,3
);

// クエリ
query_posts( $args );
// ループ
if ( have_posts() ) :
while ( have_posts() ) :
the_post();
echo $post->post_title;
endwhile;
else:
..
endif;

// クエリをリセット
wp_reset_query();
?>
これがページのメインのコンテンツ用であればあまり問題になりませんが、
サイドバーやヘッダー、フッター用にquery_postsを使う場合、ちょっと注意が必要です。

query_postsの省略形(条件無しで使う)

WordPressでは今投稿詳細ページなのか、トップページなのか、というのをアクセス時のURLで判断しています。
今回はquery_postsに「条件」を指定しましたが、このように条件なしでも使えます。
<?php
// クエリ
query_posts();
// ループ
if ( have_posts() ) :
while ( have_posts() ) :
the_post();
echo $post->post_title;
endwhile;
else:
..
endif;

?>
条件無しとはどういう事かというと、URLに従ってWordPress側で検索条件をセットしているのです。
その為、何も条件を指定しなくても使える、という事になります。

でも「サイドバーにも別の投稿を表示させたい!」となると、
1ページで2回query_postsすることになりますよね?
すると、条件分岐タグ等の関数がうまく動作しなくなります。
query_postsはグローバル変数を書き換える為、それを元に動作しているタグ(関数)が正常に動作しなくなるという訳です。

query_postsを使ったら必ずリセットする

では、どうしたら良いかと言うと、
「query_postsを使ったらリセット」すればOKです。
最初のコードにはしれっと入れておきましたが、query_postsを使い終わったら(ループが終わったら)下記コードでリセットします。
wp_reset_query();
結論としては簡単な話ですが、ハマる人も多いかと思いますので、ご参考下さいませ。