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()」という判断基準で進めてみましょう。