本文へ移動

実装例

ACFの日付で投稿を絞り込む方法
|WP_Queryのmeta_query

「ACFで入力した開催日から、今日以降のイベントだけを出したい」「期間を指定して一覧にしたい」場合は、まずACFのフィールド名と投稿編集画面の入力値を確認します。そのうえで、Date Pickerの保存値Ymdに合わせてWP_Queryのmeta_queryを組みます。

Huddly Huddly 投稿日: 2026年9月9日 更新日: 2026年9月12日 読了目安: 5分

最初にフィールド名と保存値を確認する

最初に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実画面では、この記事で使うフィールド名と表示形式、戻り値の形式を同時に確認できます。

ACF Date Pickerのフィールド名、表示形式、戻り値の形式
ACF Date Pickerフィールド名と日付形式を確認

フィールド名は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日と表示されている入力欄
投稿の日付入力開催日の入力と保存形式を分ける

投稿編集画面の表示は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へ、そのまま貼るコードではありません。

PHPtemplate-parts/event-list.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’ ) に戻してください。

基準日20260801以降の条件で、20260812と20260905の2件が並ぶサンプルサイト
表示例基準日以降の開催情報が2件並ぶ

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とループへ組み込んでください。

PHPevent-list-between.php開始日と終了日を含む期間へ差し替える$args
$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〜2026090520260812・202609052件(両方の境界を含む)
20260813〜20260905202609051件
20260812〜20260904202608121件
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出力まで直接書かず、関数やフックと表示を分けます。

実装前に確認する順番

  1. 1
    ACFの日付フィールド名を確認する
  2. 2
    Date Pickerの保存形式を確認する
  3. 3
    テンプレートパーツで最小コードを動かす
  4. 4
    タイトルと保存値で対象を確認する
  5. 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を確認した
  • 境界日を含むかをテストデータで確認した
  • ループ後の表示が崩れないことを確認した
WP Query BuilderBuilderで条件を組み直す条件を選び、WP_Queryのコードを画面で作れます。Builderでクエリを作る

この記事を書いた人

Huddly

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

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

この記事の検証情報

検証環境

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

更新履歴

  • 2026年9月12日 本文と補助情報を更新
  • 2026年9月9日 初回公開

この記事を活用する

あとで見返す・共有する

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

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