1. WordPress

【WordPress】get_posts()とWP_Queryはどちらを使うべき?使い分けを解説

Share

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