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();

結論としては簡単な話ですが、ハマる人も多いかと思いますので、ご参考下さいませ。