1. HOME
  2. WordPress
  3. WP_Queryで記事を取得する方法~基本的なやり方からfunctions.phpで再利用可能な形にする~
WordPress - 2025-08-12

WP_Queryで記事を取得する方法~基本的なやり方からfunctions.phpで再利用可能な形にする~

WordPressで記事を特定の条件で取得し、表示したいと考えたことはありませんか?例えば、「特定のカテゴリーの最新記事を5件表示したい」「カスタム投稿タイプの記事をランダムに表示したい」といった場合です。

これらの要件を満たすために最もよく使われるのが、WP_Query というWordPressの強力なクラスです。この記事では、WP_Query の基本的な使い方から、カスタム投稿タイプやタクソノミーで絞り込む応用的な方法まで解説します。

1. WP_Queryの基本:記事を取得する

WP_Query を使うには、まず取得したい記事の条件を配列($args)で指定します。その後、その配列を new WP_Query() に渡してインスタンス化します。

基本的な使い方(最新の投稿を5件取得する例)

<?php
// 取得する記事の条件を配列で指定
$args = array(
    'post_type'      => 'post',          // 投稿タイプ
    'posts_per_page' => 5,               // 取得件数
    'orderby'        => 'date',          // 並び替えの基準
    'order'          => 'DESC',          // 降順
);

// WP_Queryをインスタンス化
$the_query = new WP_Query($args);

// 記事が見つかった場合のループ処理
if ($the_query->have_posts()) {
    while ($the_query->have_posts()) {
        $the_query->the_post();
?>
        <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
        <p><?php the_excerpt(); ?></p>
<?php
    }
} else {
    // 記事が見つからなかった場合の処理
    echo '<p>記事が見つかりませんでした。</p>';
}

// 投稿データのグローバル変数をリセットする
wp_reset_postdata();
?>

【重要】 wp_reset_postdata() を忘れずに! WP_Query で新しいループを回した後は、必ず wp_reset_postdata() を呼び出して、WordPressのグローバル投稿データを元の状態に戻す必要があります。これを怠ると、メインクエリに影響が出て、サイト表示に不具合が生じる可能性があります。

2. よく使う $args のパラメータ

$args 配列には、記事の取得方法を細かく指定するための多くのパラメータがあります。以下に代表的なものを紹介します。

  • posts_per_page: 1ページあたりの記事数
  • category_name: カテゴリーのスラッグで絞り込み
  • tag: タグのスラッグで絞り込み
  • orderby: 並び順の基準(date, title, rand など)
  • order: 昇順(ASC)か降順(DESC)か
  • paged: ページネーションで現在のページ番号を取得

例:カテゴリーとタグで絞り込む

$args = array(
    'posts_per_page' => 10,
    'category_name'  => 'news',      // カテゴリースラッグが 'news' の記事
    'tag'            => 'important', // タグスラッグが 'important' の記事
);

3. カスタム投稿タイプやカスタムフィールドの場合

WordPressはカスタム投稿タイプやカスタムフィールドを使うことで、より柔軟なサイト構築が可能です。WP_Query はこれらにももちろん対応しています。

カスタム投稿タイプの記事を取得する

カスタム投稿タイプ名が event の場合、post_type にその名前を指定するだけです。

$args = array(
    'post_type'      => 'event',
    'posts_per_page' => 5,
    'orderby'        => 'date',
    'order'          => 'DESC',
);
$the_query = new WP_Query($args);

カスタムタクソノミーで絞り込む

カスタム投稿タイプ event'event_category' というカスタムタクソノミーがあり、そのターム(スラッグ)が 'seminar' の記事を取得したい場合は、tax_query を使います。

$args = array(
    'post_type'      => 'event',
    'posts_per_page' => 10,
    'tax_query'      => array(
        array(
            'taxonomy' => 'event_category',
            'field'    => 'slug',
            'terms'    => 'seminar',
        ),
    ),
);
$the_query = new WP_Query($args);

カスタムフィールドの値で絞り込む

カスタムフィールドのキーが event_date、値が 2025-08-01 の記事を取得する場合、meta_query を使います。

$args = array(
    'post_type'  => 'event',
    'meta_query' => array(
        array(
            'key'     => 'event_date',
            'value'   => '2025-08-01',
            'compare' => '=',
            'type'    => 'DATE'
        ),
    ),
);
$the_query = new WP_Query($args);

4. functions.php で再利用可能な形にする

同じようなクエリを何度も書くのは手間がかかりますし、コードの重複も発生します。functions.php に専用の関数を作成しておけば、テーマのどのファイルからでも簡単に呼び出せるようになり、保守性も高まります。

汎用的なクエリ関数を作成する

/**
 * カスタム引数でWP_Queryを実行する関数
 * @param array $args WP_Queryの引数配列
 * @return WP_Query
 */
function get_custom_posts($args = array()) {
    $default_args = array(
        'post_type'      => 'post',
        'posts_per_page' => 5,
        'orderby'        => 'date',
        'order'          => 'DESC',
    );
    
    // デフォルト引数とカスタム引数をマージ
    $merged_args = array_merge($default_args, $args);
    return new WP_Query($merged_args);
}

関数の使い方

<?php
// カスタム投稿タイプ 'event' の最新3件の記事を取得
$event_query = get_custom_posts(array(
    'post_type' => 'event',
    'posts_per_page' => 3
));

if ($event_query->have_posts()) {
    while ($event_query->have_posts()) {
        $event_query->the_post();
        // ループ内の処理
    }
}
wp_reset_postdata();
?>

まとめ

WP_Query はWordPressテーマ開発の核となる機能の一つです。$args 配列を適切に設定することで、標準の投稿はもちろん、カスタム投稿タイプやタクソノミー、カスタムフィールドを使った複雑な条件でも、柔軟に記事を取得することができます。