2026年8月30日

2026年8月30日

WordPressのget_posts・query_postsの違いと使い方

はじめに

WordPressの開発において、投稿データを取得するためには様々なメソッドが利用できます。その中でも特に重要な2つの関数がget_posts()query_posts()です。これらの関数は似ていますが、機能や使い方に違いがあります。

症状・背景

このテーマが必要になる主な場面:

  • テーマ開発で特定の投稿を取得する必要がある場合
  • プラグインの開発中に複数の投稿を一覧表示したい場合
  • WP_Queryクラスを使用せずにシンプルに投稿を操作したい時

手順・設定方法

ステップ1: get_posts()を使った基本的な投稿取得

# WordPressの既存の投稿データを取得します。ここでは特定のカテゴリーIDと数を指定します。
$args = array(
    'numberposts' => 5,
    'category' => 3
);
$recent_posts = get_posts($args);

foreach( $recent_posts as $post ) : setup_postdata( $post ); ?>
    <h2><?php the_title(); ?></h2>
<?php endforeach; wp_reset_postdata();

ステップ2: query_posts()を使った投稿の再クエリ

# ホームページで特定の投稿を表示するには、先にquery_postsを使います。
query_posts('posts_per_page=5&category_name=blog');
if ( have_posts() ) :
    while ( have_posts() ) : the_post();
        // 投稿の内容を表示します。
        echo '<h2>' . get_the_title() . '</h2>';
    endwhile;
endif; wp_reset_query();

ステップ3: マルチクエリとget_posts()・query_posts()の組み合わせ

# 複数のカテゴリーから投稿を取得します。ここではget_postsを使用します。
$args = array(
    'category__in' => array(1, 2),
    'posts_per_page' => -1,
);
$recent_posts = get_posts($args);

// クエリの実行と結果の表示
foreach( $recent_posts as $post ) : setup_postdata( $post ); ?>
    <h3><?php the_title(); ?></h3>
<?php endforeach; wp_reset_postdata();

ステップ4: 高度なフィルタリングとquery_posts()の使用

# 特定の日付範囲内の投稿を取得します。これはquery_postsを使用する場合です。
$from_date = '2023-10-01';
$to_date = '2023-10-31';

$query_args = array(
    'date_query' => array(
        array(
            'after'     => $from_date,
            'before'    => $to_date,
            'inclusive' => true
        ),
    )
);
query_posts($query_args);

if ( have_posts() ) :
    while ( have_posts() ) : the_post();
        // 投稿の情報を表示します。
        echo '<h4>' . get_the_title() . '</h4>';
    endwhile;
endif; wp_reset_query();

注意事項

  • <実践的な注意点1>: query_posts()は既存のクエリを置き換えてしまうため、pre_get_postsアクションフックを使用して代替するべきです。
  • <実践的な注意点2>: get_posts()は通常よりも多くのデータを取得しますが、その分パフォーマンスに影響が出る可能性があります。必要最低限のデータだけを取得することを心掛けましょう。
  • <セキュリティ上の注意>: クエリパラメータやPOSTデータから直接引数を受け取る際は必ず適切なフィルタリングとバリデーションを行うべきです。
  • <パフォーマンス/運用上の注意>: 大量の投稿を取得する場合には、インクリメンタルなクエリを使用したり、WP_Queryクラスを使うことを検討しましょう。

まとめ

1. get_posts(): テーマやプラグイン開発で特定の条件に合致する投稿を取得したい場合に便利です。

2. query_posts(): ホームページや固定ページなどで既存のクエリを上書きして表示を変更したい時によく使われます。

3. WP_Queryクラス: get_posts()query_posts()よりも柔軟性があり、複雑なクエリにも対応できます。

4. pre_get_postsアクションフック: クエリを置き換える代わりに、通常のクエリに追加情報を付与するための優れた方法です。

5. パフォーマンス最適化: 大規模なサイトでは特に、効率的なクエリ構築とキャッシュ活用が重要となります。

関連記事:

お気軽にご相談ください

お見積りへ お問い合わせへ