WP_Queryチートシート:条件別によく使うカスタマイズ例まとめ

WordPressで高度なカスタマイズを行う際に欠かせないのが「WP_Query」です。投稿の一覧を自由自在に取得できる一方、条件が複雑になると記述ミスもしばしば。本記事では、WP_Queryの基本から応用まで、条件別に実用的なカスタマイズ例を紹介します。コピペで使えるコード付きなので、日々の開発にぜひお役立てください。

WP_Queryで使える主な引数一覧

キー説明
post_type投稿タイプ'post', 'page', 'custom_post'
posts_per_page取得件数(-1で全件)10, -1
offsetスキップする件数5
orderby並び替えの基準'date', 'title', 'meta_value' など
order並び順'ASC', 'DESC'
pagedページ番号(2ページ目以降)get_query_var('paged')
nopagingページングなしtrue
p / page_id投稿 / 固定ページ ID123
name / pagename投稿 / 固定ページのスラッグ'sample-post'
post__in / post__not_in投稿ID配列の絞り込み[1,2,3]
cat / category_nameカテゴリー ID / スラッグ3, 'news'
category__in / category__not_in複数カテゴリー ID[1,3,5]
tag / tag_idタグスラッグ / タグID'pickup', 7
tag__in / tag__not_inタグID配列[4,5]
tax_queryカスタムタクソノミーの条件array(...)
meta_key, meta_value, meta_compare, meta_typeカスタムフィールド(1条件)'price', '>' など
meta_queryカスタムフィールド(複数条件)array(...)
date_query日付での絞り込みarray(...)
year, monthnum, day年・月・日指定2024, 5, 15
sキーワード検索'検索語'
post_status投稿ステータス'publish', 'draft'
has_passwordパスワード付き投稿かtrue / false

WP_Queryの基本構文

まずは基本の構文をおさらいしましょう。

$args = array(
    'post_type' => 'post',
    'posts_per_page' => 10,
);
$query = new WP_Query($args);

if ($query->have_posts()) :
    while ($query->have_posts()) : $query->the_post();
        the_title();
    endwhile;
    wp_reset_postdata();
endif;

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

$args = array(
    'post_type' => 'product', // カスタム投稿タイプ
    'posts_per_page' => 5,
);

カテゴリーやタグで絞り込む

$args = array(
    'category_name' => 'news', // スラッグ指定
);

$args = array(
    'tag' => 'pickup',
);

複数カテゴリーに属する投稿を取得するには:

$args = array(
    'category__and' => array(3, 5), // カテゴリーID
);

どれか一つのカテゴリーに属する投稿を取得するには:

$args = array(
    'category__in' => array(3, 5), // カテゴリーIDのいずれかを含む
);

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

$args = array(
    'post_type' => 'product',
    'tax_query' => array(
        array(
            'taxonomy' => 'genre',
            'field'    => 'slug',
            'terms'    => 'book',
        ),
    ),
);

複数のカスタムタクソノミーを AND 条件 で絞り込む:

$args = array(
    'post_type' => 'product',
    'tax_query' => array(
        'relation' => 'AND',
        array(
            'taxonomy' => 'genre',
            'field'    => 'slug',
            'terms'    => 'book',
        ),
        array(
            'taxonomy' => 'color',
            'field'    => 'slug',
            'terms'    => 'blue',
        ),
    ),
);

複数のカスタムタクソノミーを OR 条件 で絞り込む:

$args = array(
    'post_type' => 'product',
    'tax_query' => array(
        'relation' => 'OR',
        array(
            'taxonomy' => 'genre',
            'field'    => 'slug',
            'terms'    => 'book',
        ),
        array(
            'taxonomy' => 'color',
            'field'    => 'slug',
            'terms'    => 'blue',
        ),
    ),
);

特定の投稿を除外 or 含める

$args = array(
    'post__not_in' => array(10, 15), // IDで除外
);

$args = array(
    'post__in' => array(1, 3, 5), // IDで指定した投稿のみ取得
);

日付で絞り込む

$args = array(
    'date_query' => array(
        array(
            'after'     => '2024-01-01',
            'before'    => '2024-12-31',
            'inclusive' => true,
        ),
    ),
);

メタ情報で絞り込む(カスタムフィールド)

数値で比較:

$args = array(
    'meta_query' => array(
        array(
            'key'     => 'price',
            'value'   => 1000,
            'compare' => '>=',
            'type'    => 'NUMERIC',
        ),
    ),
);

一致する値を検索:

$args = array(
    'meta_query' => array(
        array(
            'key'     => 'status',
            'value'   => '公開中',
            'compare' => '=',
        ),
    ),
);

部分一致(LIKE):

$args = array(
    'meta_query' => array(
        array(
            'key'     => 'description',
            'value'   => '特別',
            'compare' => 'LIKE',
        ),
    ),
);

前方一致(LIKE + ワイルドカード):

$args = array(
    'meta_query' => array(
        array(
            'key'     => 'title',
            'value'   => '前方文字列%',
            'compare' => 'LIKE',
        ),
    ),
);

複数の値に一致(IN):

$args = array(
    'meta_query' => array(
        array(
            'key'     => 'color',
            'value'   => array('red', 'blue'),
            'compare' => 'IN',
        ),
    ),
);

NULLチェック(値が存在しない):

$args = array(
    'meta_query' => array(
        array(
            'key'     => 'discount',
            'compare' => 'NOT EXISTS',
        ),
    ),
);

空文字列のチェック:

$args = array(
    'meta_query' => array(
        array(
            'key'     => 'note',
            'value'   => '',
            'compare' => '=',
        ),
    ),
);

範囲検索(BETWEEN):

$args = array(
    'meta_query' => array(
        array(
            'key'     => 'price',
            'value'   => array(1000, 2000),
            'compare' => 'BETWEEN',
            'type'    => 'NUMERIC'
        ),
    ),
);

複数条件をAND/ORで組み合わせる:

$args = array(
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key'     => 'status',
            'value'   => '販売中',
            'compare' => '=',
        ),
        array(
            'key'     => 'stock',
            'value'   => 0,
            'compare' => '<=',
            'type'    => 'NUMERIC'
        )
    )
);

並び順を変更する

$args = array(
    'orderby' => 'meta_value_num',
    'meta_key' => 'price',
    'order' => 'DESC',
);

ランダム順で取得する:

$args = array(
    'orderby' => 'rand',
);

ページネーション対応

$paged = get_query_var('paged') ? get_query_var('paged') : 1;
$args = array(
    'paged' => $paged,
);

テンプレート側にて:

// ページナビゲーション表示
if (function_exists('wp_pagenavi')) {
    wp_pagenavi(array('query' => $query));
}

まとめ:WP_Queryの条件指定を自在に使いこなそう

WP_Queryを使いこなすことで、WordPressの柔軟な情報表示が可能になります。特に複数の条件を組み合わせる場合や、カスタム投稿やタクソノミーを利用するサイトでは必須の知識です。本記事をチートシートとして活用し、開発のスピードアップと保守性向上にお役立てください。

Contact

ウェブサイトの制作や運用に関わる
お悩みやご相談
お気軽にお問い合わせ下さい

ウェブサイトと一口に言っても、企業サイトやECサイト、ブログ、SNSなど、その“カタチ”は目的に応じてさまざまであり、構築方法や使用する技術も大きく異なります。株式会社コナックスでは、お客様のご要望やブランドの個性を丁寧に汲み取り、最適なウェブサイトの“カタチ”をご提案いたします。

デザイン、ユーザビリティ、SEO対策はもちろん、コンテンツ制作やマーケティング戦略に至るまで、あらゆるフェーズでお客様のビジネスに寄り添い、成果につながるウェブサイトづくりをサポートいたします。私たちは、ウェブサイトの公開をゴールではなくスタートと捉え、お客様のビジネスの成功に向けて共に伴走してまいります。