WordPressでカスタムクエリを書く際に必ず登場するのが、get_posts()
と WP_Query
。
どちらも投稿データを取得するための手段ですが、使い分けを誤ると意図しない結果になってしまうこともあります。
この記事では、それぞれの役割や違い、適切な使い方をわかりやすく解説します。
目次
基本的な違い
項目 | get_posts() | WP_Query |
---|---|---|
返り値 | WP_Post オブジェクトの配列 | WP_Query オブジェクト |
ループ | foreach + setup_postdata() | have_posts() + the_post() |
ページネーション | 非対応 | 対応 |
フィルター(hooks) | 無効(suppress_filters = true) | 有効(suppress_filters = false) |
コードのシンプルさ | シンプル | 柔軟だが複雑 |
拡張性 | 限定的 | 高い |
get_posts() の特徴と使い方
get_posts()
は、投稿を簡易的に取得するための関数です。内部的には WP_Query
を使っていますが、suppress_filters が true になっているため、pre_get_posts
などのフックが効きません。
使用例
$args = array(
'post_type' => 'post',
'posts_per_page' => 5
);
$posts = get_posts($args);
foreach ($posts as $post) {
setup_postdata($post);
the_title();
}
wp_reset_postdata();
このように、取得した投稿を foreach で回し、setup_postdata()
を通してテンプレートタグを有効にします。
向いているケース
- サイドバーやフッターで記事一覧を簡単に出力したい
- 投稿数が少ない
- フックやページネーションを使う必要がない
WP_Query の特徴と使い方
WP_Query
は WordPress の投稿取得クラスで、より柔軟かつ強力なカスタマイズが可能です。
ループ構造があり、ページネーションやフィルターの活用もできます。
使用例
$args = array(
'post_type' => 'post',
'posts_per_page' => 5
);
$the_query = new WP_Query($args);
if ($the_query->have_posts()) :
while ($the_query->have_posts()) : $the_query->the_post();
the_title();
endwhile;
endif;
wp_reset_postdata();
向いているケース
- メインループに近い処理をしたい
- ページネーションが必要
pre_get_posts
などのカスタマイズを行いたい- 複雑なクエリ条件を扱う
どちらを使うべきか?
状況に応じた使い分けが大切です。
get_posts() を使うべきとき
- 投稿数が少ない
- 一覧を軽量に表示したい
- カスタマイズ性は不要
WP_Query を使うべきとき
- 条件が複雑
- フィルターを活用したい
- ページネーションが必要
- 柔軟性が求められる場面
パフォーマンスに違いはある?
どちらも内部的には WP_Query
を使っているため、極端な差はありません。
ただし get_posts()
はフィルター処理などを省略しているため、軽微なパフォーマンス改善が見込めることもあります。
公式ドキュメント
まとめ
投稿の取得には get_posts()
も WP_Query
も有効ですが、使い方や目的によって適切な選択が必要です。
迷ったら「カスタマイズ性が必要なら WP_Query、軽量で済むなら get_posts()」という判断基準で進めてみましょう。