最初にフィールド名と保存値を確認する
最初にACFのフィールド名と保存値を確認します。Date Pickerは表示形式や戻り値とは別に、データベースへ Ymd 形式で保存されます。
今日以降は比較値も Ymd にそろえ、compare を >=、type を NUMERIC にします。画面表示ではなく、保存値と同じ形式で比較することが要点です。 近い順なら、meta_key => ‘event_date’、orderby => ‘meta_value_num’、order => ‘ASC’を組み合わせます。
今日以降のイベントを近い順に表示する
Date Pickerで入力した開催日を使い、今日以降だけを近い順に表示します。このサンプルでは、開催日を持つ投稿タイプを works、フィールド名を event_date としています。イベント専用の投稿タイプを event として登録したサイトなら、コードの works を event へ置き換えてください。
表示名ではなく投稿タイプの登録キーとACFのフィールド名を使います。入力画面で日付が見えていても、キーが違う投稿タイプを検索していれば対象には入りません。
次のACF実画面では、この記事で使うフィールド名と表示形式、戻り値の形式を同時に確認できます。

フィールド名はevent_date。表示形式はY年m月d日、戻り値の形式はY-m-dです。画面には出ていないデータベース保存値はYmdなので、比較値もこの形にそろえます。
最初に確認するのは保存形式
日付も投稿メタとして扱うため、先にmeta_queryの基本を押さえておくと、このあとのkey、value、compare、typeの役割を追いやすくなります。値が合っているのに0件になる場合は、meta_queryの確認手順へ進んでください。
Date Pickerの表示形式は入力画面、戻り値の形式はACF関数で取得した時の形です。データベースにはYmd、つまりYYYYMMDDで保存されます。管理画面に2026/06/14と見えていても、WP_Queryでは20260614と比較します。
この記事のYmd例はDate Picker向けです。時刻も保存するDate Time Pickerにはそのまま流用せず、フィールドタイプと保存値を確認してください。
次の投稿編集画面では、入力欄に2026年8月12日が表示されています。画像の下で、この表示と8桁の保存値を分けてコードへ渡します。

投稿編集画面の表示は2026年08月12日ですが、event_dateの保存値は20260812です。この8桁の値をmeta_queryで比較します。
今日以降のイベントだけを取得する最小例
WordPressのタイムゾーンに合わせた今日の日付をcurrent_time( ‘Ymd’ )で作り、meta_queryの比較値にします。まずは10件だけ返す最小条件で確認してください。
WP Query Builderでは、投稿タイプ「works」、投稿ステータス「publish」、件数「10」、並び順「ASC」、並び替え「meta_value_num」を選び、event_date が 20260801 以上になる数値条件を入力しました。自動最適化をオフにして生成した $args のうち、固定値 20260801 だけを $today へ置き換えています。
PHPテンプレートを使う子テーマの template-parts/event-list.php に次のコードを保存します。表示したい固定ページなどのテンプレートで、メインループの the_post() の後に get_template_part( ‘template-parts/event-list’ ); と呼び出してください。呼び出し先がPHP領域なら <?php を重ねて書く必要はありません。投稿本文や追加CSSへは貼りません。
クラシックテーマのテンプレート(またはテンプレートパーツ)で、一覧を表示したい位置に置く例です。投稿本文やfunctions.phpへ、そのまま貼るコードではありません。
<?php$today = (int) current_time( 'Ymd' ); $args = array( 'post_type' => 'works', 'post_status' => 'publish', 'posts_per_page' => 10, 'order' => 'ASC', 'orderby' => 'meta_value_num', 'meta_query' => array( array( 'key' => 'event_date', 'compare' => '>=', 'type' => 'NUMERIC', 'value' => $today ) ), 'meta_key' => 'event_date'); $event_query = new WP_Query( $args ); if ( $event_query->have_posts() ) { echo '<ul>'; while ( $event_query->have_posts() ) { $event_query->the_post(); printf( '<li><a href="%1$s">%2$s</a><br>開催日(保存値):%3$s</li>', esc_url( get_permalink() ), esc_html( get_the_title() ), esc_html( get_post_meta( get_the_ID(), 'event_date', true ) ) ); } echo '</ul>';} else { echo '<p>条件に合うイベントはありません。</p>';} wp_reset_postdata();meta_query は日付の下限を決めます。meta_key で並べるフィールドを選び、orderby の meta_value_num で数値の昇順にします。Builderが生成するのは $args までで、今日の日付、表示ループ、0件時の文言、リセットは手動で組み合わせています。
この生成コードだけでは、同じ開催日を持つ投稿どうしの順番は固定しません。必要なら、日付順が正しく動くことを確認した後でIDなどの二次ソートを手動追加します。meta_key 自体も、そのキーが保存されている投稿を対象にする点に注意してください。
まずは保存値も一緒に表示して、条件と結果を見比べます。日付を読者向けの表記へ整えるのは、対象と順番が合ってからで構いません。
ACFの入力やPHPを試すときは、本番と分けた環境で表示を確認します。サーバー上に試す場所を用意する場合は、XserverのPHP対応とバックアップ条件も確認できます。
基準日を固定して、対象の2件を見比べる
保存値が 20260712・20260812・20260905 の3件で比べます。画像は最初の $today を 20260801 に置き換えた表示です。7月12日は外れ、8月12日と9月5日が近い順に並びます。実運用では (int) current_time( ‘Ymd’ ) に戻してください。

2026年8月1日を基準にした結果は、夏の制作相談会20260812→秋のWP_Query勉強会20260905。この3件だけなら、9月6日以降は0件になります。
期間で絞り込む場合はBETWEENを使う
期間で絞る場合はcompare => ‘BETWEEN’を使い、開始日と終了日をYmdの配列で渡します。
指定期間内のイベントだけを取得するコード
次は2026年8月12日から9月5日までを対象にする例です。最初のパーツ内にある $today と $args の定義を、次のコードへ置き換えます。$event_query = new WP_Query( $args ); 以降の表示ループとリセットは残してください。別のクエリを下へ足す例ではありません。
引数や処理の一部分だけを示した例です。このまま単独で貼らず、テンプレート内のWP_Queryとループへ組み込んでください。
$args = array( 'post_type' => 'works', 'post_status' => 'publish', 'posts_per_page' => 10, 'order' => 'ASC', 'orderby' => 'meta_value_num', 'meta_query' => array( array( 'key' => 'event_date', 'compare' => 'BETWEEN', 'type' => 'NUMERIC', 'value' => array( 20260812, 20260905 ) ) ), 'meta_key' => 'event_date');この $args も、同じBuilder実画面で比較方法を「BETWEEN」、値を「20260812,20260905」に変えて生成したものです。BETWEENは開始日と終了日の両方を含みます。 境界日を含めない要件なら、>と<の2条件に分けます。
| 開始日〜終了日 | 対象の保存値 | 表示件数 |
|---|---|---|
| 20260812〜20260905 | 20260812・20260905 | 2件(両方の境界を含む) |
| 20260813〜20260905 | 20260905 | 1件 |
| 20260812〜20260904 | 20260812 | 1件 |
| 20260813〜20260904 | なし | 0件 |
この表は同じ3件に対して、開始日と終了日だけを変えた結果です。フォーム入力から期間を作る場合は、8桁かどうかだけでなく実在する日付か、開始日が終了日以前かも確認します。 未確認の入力をそのまま渡さないでください。
WP_Meta_Queryの公式リファレンスでは、type に DATE を使う場合、BETWEEN は YYYY-MM-DD 形式で保存・比較されている場合に機能する旨が説明されています。ACF Date Pickerの保存値は基本的に Ymd なので、この記事の例では DATE ではなく、Ymd に合わせた NUMERIC 比較として整理しています。
保存値と期間の境界が分かったら、WP Query Builderで同じmeta_queryを組み立てられます。今日の日付を動的に作る処理と、取得結果を表示するループはこの記事のパーツで組み合わせます。
ACFの日付条件を組み立てる
キー・比較値・compare・typeから$argsを作ります。BETWEENでは開始日と終了日を配列にし、WordPress側で対象の投稿を確認してください。
コードはどこに置くか
一覧の表示コードは固定ページや一覧のテンプレートへ置きます。functions.phpへHTML出力まで直接書かず、関数やフックと表示を分けます。
実装前に確認する順番
- 1ACFの日付フィールド名を確認する
- 2Date Pickerの保存形式を確認する
- 3テンプレートパーツで最小コードを動かす
- 4タイトルと保存値で対象を確認する
- 5境界日と0件時を確認してから日付表記を整える
実務では、まず posts_per_page を少なめにして確認するのがおすすめです。いきなり全件取得したり、複数の meta_query を組み合わせたりすると、問題が起きた時に原因を見つけにくくなります。
うまく絞り込めない時に見るポイント
多い原因は、フィールド名、日付形式、投稿タイプの違いと、絞り込み・並び順の混同です。戻り値をY-m-dにしても、Date Pickerのデータベース保存値はYmdです。
| 症状 | 最初に疑うこと | 確認方法 |
|---|---|---|
| 1件も表示されない | フィールド名か日付形式が違う | ACFのフィールド名と比較値の形式を確認する |
| 過去イベントも出る | compareやvalueが合っていない | 今日の日付がYmdで作られているか確認する |
| 並び順が日付順にならない | orderbyの指定が不足している | meta_keyとmeta_value_numを確認する |
| 想定外の投稿が混ざる | post_typeが広すぎる | eventなど対象の投稿タイプに絞る |
もうひとつ注意したいのは、日付フィールドが未入力の投稿です。未入力の投稿を含めたいのか、除外したいのかで条件は変わります。この記事の最小例では、日付が入っていない投稿は一覧に含めません。
空文字やYmd以外の値が混在すると、数値比較の結果を信頼できません。対象投稿を1件に絞り、get_post_meta( $post_id, ‘event_date’, true )で保存値を確認してください。
meta_queryとACF Date Pickerの公式資料
meta_query、compare、typeはWordPress側、Date Pickerの表示・戻り値・保存形式はACF側の公式資料で確認します。
公式リンク
公式ドキュメント
最後に判断したいこと
- ACFの保存形式と比較値を同じ基準に揃えた
- 単日・今日以降・期間指定のどれを実装するか決めた
- 日付順に並べる場合のmeta_keyとorderbyを確認した
- 境界日を含むかをテストデータで確認した
- ループ後の表示が崩れないことを確認した
この記事の検証情報
検証環境
- WordPress
- 7.1.4
- PHP
- 8.3.36
- テーマ
- wpq-media + DDEV
- 対象
- カスタム投稿 / taxonomy / meta_query
更新履歴
- 2026年9月12日 本文と補助情報を更新
- 2026年9月9日 初回公開
この記事を活用する
あとで見返す・共有する
お気に入りに保存できます。役に立ったポイントは、いいねや共有で教えてください。


