最初に「どの日付を並べたいか」を決める
WP_Queryは、投稿日、更新日、カスタムフィールドの日付で指定方法が変わります。まず実際の日付値をタイトルと一緒に表示し、並べたい値と orderby の対象が一致しているか確認してください。
投稿日は date、更新日は modified、ACFなどの独自日付は meta_key と保存形式を確認します。その後に order の向き、同日データの二次ソート、pre_get_posts やプラグインの上書きを1つずつ切り分けます。
日付順にならない症状を3つに分ける
投稿日時と、ACFなどで作ったイベント日・公開予定日・開催日は別のデータです。新着順、古い順、イベント日順のどれが違うかで確認先を分けます。
| 症状 | 最初に疑う原因 | 見る場所 |
|---|---|---|
| 新着順にならない | order と orderby の指定が想定と違う | $args の orderby / order |
| 古い順にしたいのに新しい順になる | ASC / DESC の意味を逆に覚えている | order の値 |
| イベント日順にならない | 投稿日時で並べていて、ACFの日付を見ていない | meta_key / meta_value_num |
| 一部だけ順番が入れ替わる | 同じ日時の投稿が複数あり、二次ソートがない | orderby の複数指定 |
| メイン一覧だけ順番が変わる | pre_get_posts やテーマ側の処理が上書きしている | functions.php / プラグイン |
確認の順番
- 1投稿日時順なのか、カスタムフィールドの日付順なのかを決める
- 2orderby と order を最小構成で確認する
- 3同じ日時の投稿がないか確認する
- 4ACFなどの日付フィールドなら保存形式と meta_key を確認する
- 5pre_get_posts、プラグイン、テーマ側で並び替えが上書きされていないか確認する
投稿日時で並べる最小例
まずは投稿日時で正しく並ぶかを確認します。ここで期待どおりに並ぶなら、WP_Queryの基本的な並び替えは動いていて、原因はカスタムフィールドや別の条件にある可能性が高くなります。
次のコードは、通常投稿を投稿日が新しい順に3件だけ表示する確認例です。
原因を切り分けるための一時的な確認コードです。ローカルなどの検証環境だけで使い、確認後は削除してください。
$args = [ 'post_type' => 'post', 'posts_per_page' => 3, 'orderby' => 'date', 'order' => 'DESC',]; $the_query = new WP_Query( $args ); if ( $the_query->have_posts() ) { while ( $the_query->have_posts() ) { $the_query->the_post(); echo esc_html( get_the_title() ); echo ' / '; echo esc_html( get_the_date( 'Y-m-d H:i:s' ) ); echo "\n"; }} wp_reset_postdata();このコードのポイントは、orderbyをdate、orderをDESCに固定している点です。DESCは大きい値から小さい値へ並べるため、日付でいえば新しい投稿から古い投稿へ並びます。逆に、古い投稿から新しい投稿へ並べたい場合はASCにします。
もうひとつ大事なのは、表示する日付を一緒に出していることです。タイトルだけを見ると「並んでいない」と感じても、実際には投稿日時が同じだったり、思っていた投稿日と違う値が入っていたりすることがあります。まずは画面に日付を出して、データ側を確認してください。

右端の投稿日と「開催日(保存値)」を見比べ、どちらを並び替え基準にしているか確認します。
ACFなどのカスタムフィールド日付で並べたい場合
投稿日時そのものを並べ替える場合は、orderbyとorderの基本を確認してください。ACF Date Pickerの保存形式と絞り込みは、ACFの日付フィールドを絞り込む方法で別に確認できます。
イベント一覧やセミナー一覧では、投稿日ではなく「開催日」で並べたいことがあります。この場合、orderby => ‘date’ を指定しても、開催日順にはなりません。date は投稿日時を対象にするためです。
ACF Date Picker のような日付フィールドで並べたい場合は、対象のフィールド名を meta_key に指定し、その値で並べます。ACFのDate Pickerは、表示形式や返り値形式とは別に、データベースには Ymd 形式で保存されると公式資料で説明されています。そのため、数値として並べるなら meta_value_num を使うと確認しやすいです。
| 確認する値 | この例の値 | WP_Queryでの役割 |
|---|---|---|
| 画面の表示形式 | 2026年6月14日 | 読者へ見せる表記 |
| ACFの返り値形式 | 2026-06-14 | get_field()で受け取る形式 |
| データベース保存値 | 20260614 | meta_queryと並び替えが比較する値 |
クエリで比較するのは、返り値の2026-06-14ではなく、保存値と同じYmd形式です。今日ならcurrent_time( ‘Ymd’ )で20260730のような値を作ります。
クラシックテーマのテンプレート(またはテンプレートパーツ)で、一覧を表示したい位置に置く例です。投稿本文やfunctions.phpへ、そのまま貼るコードではありません。
$args = [ 'post_type' => 'event', 'posts_per_page' => 10, 'meta_query' => [ 'event_date_clause' => [ 'key' => 'event_date', 'value' => current_time( 'Ymd' ), 'compare' => '>=', 'type' => 'NUMERIC', ], ], 'orderby' => [ 'event_date_clause' => 'ASC', 'ID' => 'ASC', ],]; $event_query = new WP_Query( $args ); if ( $event_query->have_posts() ) { while ( $event_query->have_posts() ) { $event_query->the_post(); echo esc_html( get_the_title() ); echo ' / '; echo esc_html( get_post_meta( get_the_ID(), 'event_date', true ) ); echo "\n"; }} wp_reset_postdata();このコードでは、event_dateを並び替え対象にし、current_time( ‘Ymd’ )以上の保存値だけに絞っています。そのため、過去のイベントを除き、今日以降を近い順に表示します。同じ開催日の投稿はIDの小さい順に固定しています。
つまずきやすいのは、ACFの「表示形式」や「返り値形式」を見て、保存値も同じだと思ってしまうことです。実際にWP_Queryが比較するのは、データベースに保存されているpost metaです。画面表示の2026年6月14日、返り値の2026-06-14、保存値の20260614を別々に確認してください。

フィールド名はevent_date、画面表示はY年m月d日、返り値はY-m-dです。WP_Queryが比較するデータベース保存値はYmd形式です。
原因ごとの切り分けポイント
表示件数を3件程度にし、日付値を画面へ出します。post_type、meta_query、tax_query、ページネーション、並び順は1つずつ戻してください。
1. ASC と DESC の向きを逆に覚えている
ASC は小さい値から大きい値へ、DESC は大きい値から小さい値へ並べます。日付の場合、新しい日付ほど値が大きくなるため、新着順は基本的に DESC、古い順は ASC です。
イベント日順では少し感覚が変わります。今日以降のイベントを近い順に表示したい場合は、過去日を除外したうえで ASC にします。過去日を除外しないまま ASC にすると、古いイベントが先頭に出て「近い順になっていない」と感じることがあります。
2. 並べたい日付と orderby の対象が違う
orderby => ‘date’ は投稿日時、orderby => ‘modified’ は更新日時です。イベント日や締切日など、独自に作った日付フィールドではありません。
date_queryは投稿日時などを期間で絞り込むための指定で、並び替え基準を選ぶorderbyの代わりにはなりません。「今年の記事だけを新しい順にする」なら、date_queryで対象期間を絞り、orderby => ‘date’とorder => ‘DESC’で順番を決めます。
カスタムフィールドの日付で並べるなら、meta_key と orderby => ‘meta_value’ または meta_value_num を使います。日付の保存形式によって向いている指定が変わるため、まずは実際の保存値を get_post_meta() で表示して確認してください。
なお、meta_keyやmeta_queryを使う並び替えでは、そのキーが未保存の投稿は通常の結果から外れます。「日付未入力を最後に回したい」場合は、未入力を含める条件と並び順を別途設計してください。
3. 同じ日時の投稿が多く、順番が安定して見えない
複数の記事が同じ投稿日時、または同じカスタムフィールド値を持っている場合、その中の順番が期待と違って見えることがあります。日付だけでは順番を一意に決められないためです。
この場合は、日付に加えて ID などの二次ソートを使うと、確認しやすくなります。たとえば投稿日が同じものはIDの大きい順にしたい、というように補助的な並び順を足します。
引数や処理の一部分だけを示した例です。このまま単独で貼らず、テンプレート内のWP_Queryとループへ組み込んでください。
$args = [ 'post_type' => 'post', 'posts_per_page' => 10, 'orderby' => [ 'date' => 'DESC', 'ID' => 'DESC', ],];このコードのポイントは、orderbyを配列で指定している点です。まず投稿日で新しい順に並べ、同じ投稿日の中ではIDが大きいものを先にします。これで「同じ日付の中だけ順番が毎回違うように見える」状態を減らせます。
4. pre_get_posts や別の処理で上書きされている
テンプレートに書いた $args が正しくても、メインクエリを pre_get_posts で変更していたり、プラグインやテーマ側が並び順を変えていたりすると、意図した順番にならないことがあります。
特にアーカイブページや検索結果ページでは、テンプレート内のサブクエリと、WordPressが最初から持っているメインクエリを混同しやすいです。どちらのクエリを直しているのかを分けて確認してください。サブクエリを使うなら new WP_Query() の結果を表示しているか、メインクエリを変えるなら pre_get_posts の条件分岐が適切かを見る必要があります。
5. 別ループの投稿データが残っている
複数のWP_Queryを使っている場合、ループ後に wp_reset_postdata() を呼ばないと、その後のテンプレートタグが別ループの投稿を参照してしまうことがあります。これは並び順そのものを変える原因というより、「違う記事が表示されているように見える」原因です。
日付順の確認中に、タイトルや日付の表示が想定とズレる場合は、ループ後に wp_reset_postdata() があるかも確認してください。WordPress公式リファレンスの標準ループ例でも、別クエリのループ後に投稿データを戻す処理が示されています。
公式資料で確認するポイント
WP_Queryの日付順は、orderby と order だけでなく、Date Parameters、Custom Field Parameters、ループ後の投稿データリセットとも関係します。この記事で扱った確認ポイントを公式資料で見る時は、次のページを開くと対応箇所を追いやすいです。
ACF Date Pickerを使っている場合は、WordPress側の資料だけでなく、ACF側の保存形式も確認してください。表示形式や返り値形式を変えても、WP_Queryが比較する保存値の考え方を押さえておくと、日付順のトラブルを減らせます。
公式リンク
公式ドキュメント
最後に確認したいこと
並べたい日付、向き、表示しているループ、保存値を分けます。投稿日順だけ合うのか、過去日だけ混じるのか、同日の中だけ不安定なのかを確認すれば、orderby、meta_key、保存形式のどこを直すか判断できます。
日付順の最終判断
- 並び替える日付が投稿日・更新日・ACFのどれか決まっている
- 同日データの二次ソートまで要件に含めた
- ACF日付では保存値の形式とorderby方式を揃えた
- 別処理の上書き有無を最小例との差で判断した
- 変更前後の投稿ID順を比較した
この記事の検証情報
検証環境
- WordPress
- 7.1
- PHP
- 8.3.33
- テーマ
- wpq-media + DDEV
- 対象
- カスタム投稿 / taxonomy / meta_query
更新履歴
- 2026年9月7日 初回公開
この記事を活用する
あとで見返す・共有する
お気に入りに保存できます。役に立ったポイントは、いいねや共有で教えてください。


