説明
get_posts() は、条件を指定して投稿(や固定ページ・カスタム投稿)を配列で取得する関数です。WP_Query を簡易的に使える関数で、ループを汚さずに記事一覧を取り出せます。
基本構文
get_posts( array $args = null ): WP_Post[]|int[]
引数
$args:取得条件の配列。numberposts、category、post_type、orderby、order、meta_keyなど
戻り値
WP_Post オブジェクトの配列。fields => 'ids' のときはIDの配列。
使い方(サンプル)
$posts = get_posts( array(
'post_type' => 'post',
'numberposts' => 5,
'orderby' => 'date',
'order' => 'DESC',
) );
foreach ( $posts as $post ) {
echo esc_html( $post->post_title );
}
注意点
numberpostsの既定値は5件です。全件取得は-1を指定しますが、件数が多いとメモリを圧迫します。- ループ内のグローバル
$postは更新されないため、テンプレートタグを使う場合はsetup_postdata()が必要です。 - ページネーションが必要な場合は
WP_Queryを使います。 suppress_filtersが既定でtrueのため、一部のフィルターが効きません。
実務での使いどころ
- フロントページや固定ページに、「最新のお知らせ3件」のような別枠の一覧を出すとき(ページ送りが不要なとき)。
- 投稿IDの配列だけが欲しいとき。
'fields' => 'ids'を指定すると、IDだけを取得できます。 - 関連記事や、おすすめ記事の取得。
よくあるミスと対処
numberpostsを指定せず、5件しか出ない。get_posts()の既定の取得件数は5件です。- ループ内で
the_title()などのテンプレートタグを使う前に、setup_postdata()を呼んでいない(関数の中で使う場合は、global $post;の宣言も必要です)。現在のページの情報が出てしまいます。 - メインクエリの一覧を変えるために使っている。
get_posts()は別のクエリなので、メインの一覧には影響しません(変更したいときはpre_get_postsフックを使います)。なお、pre_get_postsはget_posts()の内部クエリでも実行されるため、フック側ではis_main_query()の判定が必要です。
NG例
$posts = get_posts( array( 'post_type' => 'news', 'numberposts' => 3 ) );
foreach ( $posts as $post ) {
the_title(); // 現在のページのタイトルが出てしまう
}
OK例
global $post; // 関数の中で使う場合に必要
foreach ( $posts as $post ) {
setup_postdata( $post );
the_title();
}
wp_reset_postdata();
使い分け早見表
| やりたいこと | 使うもの |
|---|---|
| 配列だけが欲しい(ループ不要) | get_posts() |
| ページ送り付きの一覧や、ループ処理 | WP_Query |
| そのページの一覧の条件を変える | pre_get_posts フック |
関連項目
WP_Query、get_post()、wp_get_recent_posts()、setup_postdata()、wp_reset_postdata()
公式リファレンス:get_posts() | Function | WordPress Developer Resources

コメント