本文へ移動

実装例

WordPressで期間を指定して記事を絞り込む方法
|WP_Queryのdate_queryを解説

「4月に公開した記事だけ」「この日からこの日まで」といった一覧は、WP_Queryのdate_queryで作れます。境界日を含めるか、どの日付列を見るかを先に決めるのがポイントです。

Huddly Huddly 投稿日: 2026年9月14日 読了目安: 4分

投稿の日付を期間で絞るならdate_queryを使います

投稿日や更新日を基準に記事を絞るときは、date_queryafterbeforeを指定します。開始日・終了日を含めるならinclusive => trueを加え、通常の投稿日ならcolumnは既定のpost_dateで構いません。

ACFなどのカスタムフィールドに保存した開催日はdate_queryではなくmeta_queryの対象です。まず「WordPressの投稿日時」と「独自に保存した日付」のどちらを見たいかを分けましょう。

最初に、どの日付で絞り込むかを決める

date_queryで絞り込めるのは、投稿テーブルにある公開日時・更新日時です。「2026年4月に公開したお知らせ」「先週更新した記事」のような条件に向いています。

絞り込みたい日付使う条件代表的な指定
投稿の公開日時date_querypost_date(既定)
投稿の更新日時date_querypost_modified
GMTの公開日時date_querypost_date_gmt
ACFの開催日・期限meta_queryevent_dateなどのメタキー

独自に設けた「イベントの開催日」という項目は、記事の投稿日とは別項目です。たとえば5月に公開したイベント記事の開催日が8月なら、post_dateは5月、ACFのevent_dateは8月です。開催予定だけを出したい場合は、次のACF日付の記事へ進んでください。

ACFの日付で絞るACFの日付フィールドをWP_Queryで絞り込む方法記事を読む

WP Query Builderで開始日・終了日・境界を入力する

公開中のWP Query Builderで「詳細設定(全項目)」を選び、「Date Query(日付の条件)」を開きます。この記事の基本例では、次の値を入力します。

入力欄意味
投稿タイプpost通常投稿を対象にする
公開状態publish公開済みだけにする
取得件数5最大5件を表示する
並び方向 / orderDESC新しい日付から並べる
並べ替えの基準 / orderbydate投稿日を基準にする
開始日 / after2026-04-014月1日以降
終了日 / before2026-04-304月30日以前
境界日を含める / inclusivetrue開始日と終了日も含める
固定表示を無視 / ignore_sticky_poststrue独自一覧の日付順を保つ

「Date 条件の組み方」はdate_queryで組む、「対象の日付」は既定のpost_dateです。Performance / Cacheでは「固定表示を無視」をtrueにし、先頭固定の記事が日付順へ割り込まないようにしました。自動高速化はOFFにし、この記事で説明する条件だけが生成される状態にしています。

WP Query BuilderのDate Queryへ4月1日から4月30日までとinclusive trueを入力し、右側にdate_queryコードが生成された画面
公開中WP Query Builderの実画面入力と生成されたコードを同じ画面で確認

開始日・終了日・境界日と、固定表示を無視する指定がWP Query Builderの生成コードへ反映されています。

次は、この画面でWP Query Builderが生成したコードです。配列のキー順や書式は変更していません。

引数や処理の一部分だけを示した例です。このまま単独で貼らず、テンプレート内のWP_Queryとループへ組み込んでください。

PHPgenerated-date-query-args.php2026年4月に公開した通常投稿を最大5件取得する条件
$args = array(    'post_type' => 'post',    'post_status' => 'publish',    'posts_per_page' => 5,    'order' => 'DESC',    'orderby' => 'date',    'date_query' => array(        array(            'after' => '2026-04-01',            'before' => '2026-04-30',            'inclusive' => true        )    ),    'ignore_sticky_posts' => true);

afterbeforeは同じ条件配列へ入れます。これで「4月1日以降」かつ「4月30日以前」です。この例ではinclusive => trueも指定しているため、4月1日と4月30日を含みます。含めたくない場合はfalseにします。省略した場合の既定値は、後ほど境界日の比較で説明します。posts_per_pageは期間内の総件数ではなく、返す最大件数を決めています。

生成した条件は、本番サイトへ直接貼る前に、投稿データを分けたWordPress環境で確認します。検証環境やバックアップ先をこれから用意する場合は、Xserverの対応PHPやバックアップ条件も公式情報で確かめられます。

生成された$argsを表示ループへつなぐ

WP Query Builderが作るのは$argsです。記事タイトルを一覧へ出すには、WP_Queryへ渡す処理と表示ループを追加します。次の完成例では、上の生成配列を変更せずに使っています。

PHPtemplate-parts/april-posts.php2026年4月の記事タイトルと投稿日を一覧表示する
<?php$args = array(    'post_type' => 'post',    'post_status' => 'publish',    'posts_per_page' => 5,    'order' => 'DESC',    'orderby' => 'date',    'date_query' => array(        array(            'after' => '2026-04-01',            'before' => '2026-04-30',            'inclusive' => true        )    ),    'ignore_sticky_posts' => true); $period_query = new WP_Query( $args ); if ( $period_query->have_posts() ) :    ?>    <section aria-labelledby="april-posts-title">        <h2 id="april-posts-title">4月の記事</h2>        <ul>            <?php while ( $period_query->have_posts() ) : ?>                <?php $period_query->the_post(); ?>                <li>                    <a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>                    <time datetime="<?php echo esc_attr( get_the_date( DATE_W3C ) ); ?>">                        <?php echo esc_html( get_the_date( 'Y年n月j日' ) ); ?>                    </time>                </li>            <?php endwhile; ?>        </ul>    </section>    <?phpelse :    echo '<p>この期間の記事はありません。</p>';endif; wp_reset_postdata();

クラシックテーマの子テーマなら、このファイルをtemplate-parts/april-posts.phpとして保存し、表示したい固定ページテンプレートのメインループ内で本文の後から呼びます。

引数や処理の一部分だけを示した例です。このまま単独で貼らず、テンプレート内のWP_Queryとループへ組み込んでください。

PHPpage.php固定ページの本文後から期間指定一覧を1回呼び出す
<?php get_template_part( 'template-parts/april-posts' ); ?>

WP_Queryのループが終わったらwp_reset_postdata()で投稿データを元へ戻します。テンプレートへ直書きする場合も、同じ一覧コードを複数箇所へ重複して貼らないようにしてください。

分離したWordPress環境で2026年4月の記事が投稿日降順に5件表示され、取得ID15、14、13、12、11を確認できる画面
実際のWP_Query結果4月の記事を新しい順に5件取得

期間内には6件ありますが、posts_per_pageが5なので、投稿日が新しいID15〜11を表示します。

期間と対象日付を選んで$argsを作る

after・before・inclusiveと、投稿日・更新日のcolumnを選べます。生成後は表示ループへつなぎ、実際の投稿で境界日と件数を確認してください。

境界・年月・対象列を使い分ける

開始日と終了日を含めるか、年・月だけで指定するか、どの日付列を調べるかを順に使い分けます。

inclusiveで開始日と終了日を含める

inclusiveを省略した場合の既定値はfalseです。afterbeforeに指定した境界そのものを含めたいときはtrueにします。

分離した検証環境で、投稿日が4月8日・11日・16日・22日の4件を対象に比較しました。trueでは両端を含む4件、falseでは両端を除いた2件です。

2026年4月8日から4月22日のdate_queryでinclusive trueはID14、13、12、11、falseはID13、12になった比較画面
境界日の確認結果trueは両端を含み、falseは両端を除く

同じ投稿データと期間でinclusiveだけを切り替えた結果です。

WP Query Builderが生成するY-m-d形式とinclusive => trueでは、終了日の23時59分59秒まで含む形に補完されます。2026/04/30など、Y-m-d以外の文字列形式では同じ補完が行われないため、Y-m-d形式または年・月・日の配列を使い、境界日に時刻のある投稿でも確認してください。

年・月だけで絞る方法を使い分ける

「2026年4月」のように年月が決まっている場合は、date_queryの1条件へyearmonthを入れられます。

引数や処理の一部分だけを示した例です。このまま単独で貼らず、テンプレート内のWP_Queryとループへ組み込んでください。

PHPdate-query-year-month.php2026年4月に公開した投稿へ絞るdate_query
$args = array(    'post_type'      => 'post',    'post_status'    => 'publish',    'posts_per_page' => 5,    'date_query'     => array(        array(            'year'  => 2026,            'month' => 4,        ),    ),);

WP_Query直下にもyearmonthnumがあります。WP Query Builderでは「Date 条件の組み方」をtop-levelだけ使うへ切り替えると入力できます。直下はmonthnumdate_query内はmonthと名前が違う点に注意してください。

書く場所月のキー向いている指定
date_query内month期間・複数条件・columnを使う指定
WP_Query直下monthnum単純な年・月の指定

両方を同時に使うと、条件が上書きされるのではなく、原則として両方を満たす投稿へ狭まります。理由がなければ、同じ年月を二重に指定しないでください。

投稿日・更新日・GMTのcolumnを選ぶ

columnを省略するとpost_dateです。管理画面で設定した公開日時を基準にする一般的な記事一覧では、そのままで構いません。

column見る値使う前の確認
post_dateサイトのタイムゾーンで扱う公開日時通常の投稿日一覧か
post_modifiedサイトのタイムゾーンで扱う更新日時更新によって一覧が動いてよいか
post_date_gmtGMTの公開日時外部システムとGMTで比較する必要があるか
post_modified_gmtGMTの更新日時更新日時をGMTで扱う設計か

orderby => dateは並び順、date_queryは取得範囲です。期間を変えずに更新日順へ並べたい場合と、更新日そのものを期間条件にしたい場合を混同しないでください。

日付順を確認するWP_Queryで記事の日付順がうまくいかない原因記事を読む

カテゴリーや検索語と組み合わせるときはANDになる

WP_Query直下へdate_querytax_querymeta_queryを並べると、それぞれの条件をすべて満たす投稿が対象です。たとえば「4月に公開され、newsカテゴリーにも属する投稿」です。

date_query内に条件を複数置く場合は、その中のrelationANDまたはORを指定できます。一方、date_querymeta_queryをまたいだORは、通常のWP_Query引数だけでは表現できません。

AND・ORを整理するWP_Queryで複数条件を組み合わせる方法記事を読む

実装後は境界・0件・タイムゾーンまで確認する

日付条件は、範囲内の1件を見るだけでは境界のずれを見つけにくいため、前後を含む小さなデータで確認します。

取得結果を確認する順番

  1. 1
    対象の投稿に、開始日前・開始日・期間内・終了日・終了日後の日時を用意する
  2. 2
    inclusive trueとfalseで両端の投稿が変わるか確認する
  3. 3
    posts_per_pageより多い投稿がある場合、表示件数と並び順を確認する
  4. 4
    0件の期間で代替メッセージが出るか確認する
  5. 5
    サイトのタイムゾーンと、GMT列を選んでいないか確認する
  6. 6
    一覧後のタイトルや本文が元の固定ページへ戻るか確認する

相対日付の文字列は実行日によって結果が変わります。記事や検証記録として再現したい場合は、まず固定日付で期待するIDを確認してから、必要ならcurrent_time()などを使う動的条件へ置き換えます。

date_queryの最終チェック

  • 投稿の公開日時・更新日時と、ACFなどの独自日付を分けた
  • afterとbeforeを同じ条件配列へ入れた
  • 境界日を含めるかinclusiveで明示した
  • columnを省略する理由、または変更する理由を説明できる
  • 年・月の直下指定とdate_queryを二重に入れていない
  • 開始日前・境界日・期間内・終了日・終了日後で取得結果を確認した
  • 独自ループ後にwp_reset_postdata()を実行した

date_queryの公式資料を確認する

境界日、日付列、年月のキーはWordPress公式資料で確認できます。実装時に迷ったら、次の項目へ戻ってください。

date_queryのよくある質問

最後に、実装時に混同しやすい日付の種類と境界指定を短く整理します。

WP Query BuilderBuilderで条件を組み直す条件を選び、WP_Queryのコードを画面で作れます。Builderでクエリを作る

この記事を書いた人

Huddly

Web制作 / フロントエンドエンジニア

WordPressとフロントエンド実装で迷いやすい点を、公式情報と検証結果を分けながら、初学者にも追いやすい順序で整理しています。

この記事の検証情報

検証環境

WordPress
7.1
PHP
8.3.33
テーマ
wpq-media + DDEV
対象
カスタム投稿 / taxonomy / meta_query

更新履歴

  • 2026年9月14日 初回公開

この記事を活用する

あとで見返す・共有する

お気に入りに保存できます。役に立ったポイントは、いいねや共有で教えてください。

任意のご支援 役に立ったときだけ、活動を応援できます OFUSEはサイト・記事制作に使います。支援の有無で、読める内容や使える機能は変わりません。