get_postsとquery_postsを使い分け

get_postsとquery_postsを使い分け - 同じような機能を持つquery_postsとget_postsは、どうを使い分けたらいいのか整理してみた

説明

get_postsquery_postsは、どちらも複数の投稿情報を取得することができる便利な関数である。パラメータとして指定できる内容も共通しているものが多く、query_postsがより詳細なパラメータを指定でき、高機能になっている。
まずは、パラメータで指定できる意味(目的)が同じキーワードを見ていこう。
意味get_postsのキーワードquery_postsのキーワード
取得件数numberpostsposts_per_page
取得開始位置offsetoffset
ソート対象orderbyorderby
ソート順orderorder
取得する投稿情報IDincludepost__in
除外する投稿情報IDexcludepost__not_in
投稿情報タイプpost_typepost_type
取得・除外するカテゴリIDcategorycat
カスタムフィールドの名前meta_keymeta_key
カスタムフィールドの値meta_valuemeta_value
キーワード名に若干違いはあるが、値の指定方法も共通しており、これらの条件で投稿情報を取得するならばどちらでも対応できることがわかる。
次に、query_postsにのみ存在する主なキーワードを見てみよう。
キーワード意味
s検索文字
category_nameカテゴリ名
tag投稿タグのスラッグ
author投稿者ID
author_name投稿者名
これのほか、カテゴリや投稿タグについては別のキーワードがあり、さらに投稿日時による絞り込みも可能である。投稿タグや投稿者、投稿日時をによる仕込みこみを行う場合は、query_postsを使用するのが妥当だろう。

このように、query_postsはget_postsの検索機能を内包し、さらにプラスアルファの検索機能を備えていることを確認できたわけだが、この2つの関数には検索機能のほかに本質的な違いがある。それは、グローバル変数へ影響を及ぼすかどうか。query_postsの検索結果はさまざまなグローバル変数に影響を及ぼすが、get_postsの検索結果にはそういったことがない。

具体的な使い方の違いを少し紹介する。
$posts1 = get_posts( 'category=1' );
$posts2 = query_posts( 'cat=1' );
この場合、どちらもカテゴリIDが1のカテゴリに属する投稿情報が取得でき、$posts1$posts2の内容は同じ。どちらも$posts1および$posts2に直接アクセスできるが、$posts2の内容に関してはhave_postsおよびthe_postを使ったおなじみのループ処理も利用可能である。
<?php while ( have_posts() ) : the_post(); ?>
// ここに処理を記述
<php endwhile; ?>
この違いこそが、get_postsとquery_postsの本質的な違いといえる。

次は、サイドバーに特定のカテゴリの投稿記事の見出しを表示するケース。この場合は、get_postsを使用するほうがいい。
<ul>
<?php
$info_posts = query_posts( 'cat=1' );
foreach ( $info_posts as $info ) {
	echo '<li>'.$info->post_title.'</li>';
}
?>
</ul>
その理由は、query_postsを使用すると、一部のグローバル変数($postsなど)の内容だけでなく、is_singleなどの一部の関数の結果も変わってしまうから。タイミングにもよるが、テーマが意図していない振る舞い(表示内容)になってしまう可能性がある。

今度は、キーワード検索で特定のカテゴリのみを検索する場合。こちらは、query_postsを使用するほうがいいだろう。具体的な使い方としては、テーマ内のsearch.phpの冒頭で次のような処理を行えばいい。
<?php
global $query_string;
query_posts( $query_string.'&cat=1,2,3' );
?>
$query_stringには、検索キーワードを含んだ検索条件のパラメータが格納されており、こうすることでカテゴリIDが1、2、3の何れかに属する投稿情報を検索できる。検索結果の内容は、グローバル変数にも反映されるので、基本的にはそのほかの部分を修正する必要はないだろう。

get_postsとquery_postsのおおよその違いはこんな感じだ。

2011/8/1追記:「時代はWP_Queryなのか」も合わせてお読みください。

関連

  • get_posts - 条件にマッチする投稿情報を取得する
  • query_posts - 条件を指定して投稿情報をロードする

お勧めコンテンツ

get_previous_post_link(2013年10月28日 登録)

string get_previous_post_link( [ string $format = '&laquo; %link' [ , string $link = '%title' [ , bool $in_same_cat$in_same_term = false [ , mixed $excluded_categories$excluded_terms = '' [ , string $taxonomy = 'category' ] ] ] ] ] )
直前の投稿ページのリンクを取得する。

get_category(2011年5月25日 登録)

mixed get_category( mixed $category [ , string $output = OBJECT [ , string $filter = 'raw' ] ] )
IDを指定してカテゴリー情報を取得する。

wp_head(2010年9月8日 登録)

void wp_head( )
wp_headアクションを実行する。

is_main_query(2012年3月5日 登録)

bool is_main_query( )
現在の投稿情報が最初に検索されたものか調べる。

bloginfo(2009年11月12日 登録)

void bloginfo( [ string $show = '' ] )
パラメータ$showで指定されたサイト情報を表示する。$showを省略した場合はブログタイトルを表示する。

最終更新日時 : 2011-08-01 18:38