本文へ移動

トラブルシュート

WP_Queryで日付順に並ばない原因
|orderby・order・日付値を確認

「新着順にしたいのに古い記事が先に出る」「投稿日順にはなるがイベント開催日順にならない」場合は、画面に日付値を出して基準を確認します。投稿日ならdate、更新日ならmodified、ACFなどの独自日付ならmeta_keyと保存値を見ます。

Huddly Huddly 投稿日: 2026年9月7日 読了目安: 6分

最初に「どの日付を並べたいか」を決める

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. 1
    投稿日時順なのか、カスタムフィールドの日付順なのかを決める
  2. 2
    orderbyorder を最小構成で確認する
  3. 3
    同じ日時の投稿がないか確認する
  4. 4
    ACFなどの日付フィールドなら保存形式と meta_key を確認する
  5. 5
    pre_get_posts、プラグイン、テーマ側で並び替えが上書きされていないか確認する

投稿日時で並べる最小例

まずは投稿日時で正しく並ぶかを確認します。ここで期待どおりに並ぶなら、WP_Queryの基本的な並び替えは動いていて、原因はカスタムフィールドや別の条件にある可能性が高くなります。

次のコードは、通常投稿を投稿日が新しい順に3件だけ表示する確認例です。

原因を切り分けるための一時的な確認コードです。ローカルなどの検証環境だけで使い、確認後は削除してください。

PHPdate-order-check.php投稿日時の新しい順に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();

このコードのポイントは、orderbydateorderDESCに固定している点です。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-14get_field()で受け取る形式
データベース保存値20260614meta_queryと並び替えが比較する値

クエリで比較するのは、返り値の2026-06-14ではなく、保存値と同じYmd形式です。今日ならcurrent_time( ‘Ymd’ )20260730のような値を作ります。

クラシックテーマのテンプレート(またはテンプレートパーツ)で、一覧を表示したい位置に置く例です。投稿本文やfunctions.phpへ、そのまま貼るコードではありません。

PHPevent-date-order.phpACFの日付フィールドを使ってイベント日が近い順に並べる例
$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を別々に確認してください。

匿名の検証環境にあるACF Date Pickerのフィールド名、表示形式、返り値形式
ACF Date Picker表示形式・返り値・保存値を分けて確認

フィールド名はevent_date、画面表示はY年m月d日、返り値はY-m-dです。WP_Queryが比較するデータベース保存値はYmd形式です。

原因ごとの切り分けポイント

表示件数を3件程度にし、日付値を画面へ出します。post_typemeta_querytax_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_keyorderby => ‘meta_value’ または meta_value_num を使います。日付の保存形式によって向いている指定が変わるため、まずは実際の保存値を get_post_meta() で表示して確認してください。

なお、meta_keymeta_queryを使う並び替えでは、そのキーが未保存の投稿は通常の結果から外れます。「日付未入力を最後に回したい」場合は、未入力を含める条件と並び順を別途設計してください。

3. 同じ日時の投稿が多く、順番が安定して見えない

複数の記事が同じ投稿日時、または同じカスタムフィールド値を持っている場合、その中の順番が期待と違って見えることがあります。日付だけでは順番を一意に決められないためです。

この場合は、日付に加えて ID などの二次ソートを使うと、確認しやすくなります。たとえば投稿日が同じものはIDの大きい順にしたい、というように補助的な並び順を足します。

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

PHPdate-order-with-id.php同じ投稿日がある時に、日付順に加えてID順も指定する例
$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の日付順は、orderbyorder だけでなく、Date Parameters、Custom Field Parameters、ループ後の投稿データリセットとも関係します。この記事で扱った確認ポイントを公式資料で見る時は、次のページを開くと対応箇所を追いやすいです。

ACF Date Pickerを使っている場合は、WordPress側の資料だけでなく、ACF側の保存形式も確認してください。表示形式や返り値形式を変えても、WP_Queryが比較する保存値の考え方を押さえておくと、日付順のトラブルを減らせます。

公式リンク

公式ドキュメント

最後に確認したいこと

並べたい日付、向き、表示しているループ、保存値を分けます。投稿日順だけ合うのか、過去日だけ混じるのか、同日の中だけ不安定なのかを確認すれば、orderbymeta_key、保存形式のどこを直すか判断できます。

日付順の最終判断

  • 並び替える日付が投稿日・更新日・ACFのどれか決まっている
  • 同日データの二次ソートまで要件に含めた
  • ACF日付では保存値の形式とorderby方式を揃えた
  • 別処理の上書き有無を最小例との差で判断した
  • 変更前後の投稿ID順を比較した
WP Query BuilderBuilderで条件を組み直す条件を選び、WP_Queryのコードを画面で作れます。Builderでクエリを作る

この記事を書いた人

Huddly

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

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

この記事の検証情報

検証環境

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

更新履歴

  • 2026年9月7日 初回公開

この記事を活用する

あとで見返す・共有する

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

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