WP_Queryで投稿の並び順を自由に変える
WordPressで「新着順じゃなくてランダムに記事を表示したい」「日付の古い順に並べたい」と思ったことはありませんか?
WP_Queryのorderbyパラメータを使えば、投稿の並び順を自由にコントロールできます。この記事では、日付順・ランダム・タイトル順など、よく使う並び替えパターンをコード付きで紹介します。
基本の書き方:orderbyとorderを組み合わせる
WP_Queryで並び順を指定するには、orderbyとorderの2つのパラメータを使います。
$args = array(
'post_type' => 'post',
'posts_per_page' => 6,
'orderby' => 'date', // 並び替えの基準
'order' => 'DESC', // DESC(新しい順)/ ASC(古い順)
);
$query = new WP_Query( $args );各パラメータの解説
post_type:対象の投稿タイプ(post・page・カスタム投稿タイプ名など)posts_per_page:取得する件数(-1で全件取得)orderby:並び替えの基準(後述)order:DESCが降順(大→小)、ASCが昇順(小→大)
よく使うorderbyの値一覧
| orderbyの値 | 並び替えの基準 |
|---|---|
| date | 投稿日時(デフォルト) |
| modified | 最終更新日時 |
| title | タイトルのアルファベット順 |
| rand | ランダム |
| menu_order | 固定ページの並び順 |
| meta_value | カスタムフィールドの値(文字列) |
| meta_value_num | カスタムフィールドの値(数値) |
実装パターン別コード
① 新着順(日付の新しい順)
$args = array(
'post_type' => 'post',
'posts_per_page' => 6,
'orderby' => 'date',
'order' => 'DESC',
);これはWP_Queryのデフォルト動作なので、orderbyとorderを省略しても同じ結果になります。
② 日付の古い順
$args = array(
'post_type' => 'post',
'posts_per_page' => 6,
'orderby' => 'date',
'order' => 'ASC',
);連載記事や手順を追って読む記事一覧などに使えます。orderをASCに変えるだけでOKです。
③ ランダム表示
$args = array(
'post_type' => 'post',
'posts_per_page' => 6,
'orderby' => 'rand',
);サイドバーの「おすすめ記事」やトップページのピックアップ枠などでよく使います。ページを読み込むたびに順番が変わります。orderの指定は不要です。
④ タイトルの五十音・アルファベット順
$args = array(
'post_type' => 'post',
'posts_per_page' => -1,
'orderby' => 'title',
'order' => 'ASC',
);用語集や作品一覧など、タイトルを辞書順に並べたいときに便利です。日本語の場合はひらがな・カタカナの順に並びます(漢字は読み順にならないので注意)。
⑤ 最終更新日順
$args = array(
'post_type' => 'post',
'posts_per_page' => 6,
'orderby' => 'modified',
'order' => 'DESC',
);「最近更新した記事」を表示したいときに使います。リライト済み記事を目立たせたい場合などにも使えます。
実装コード(ループ全体)
<?php
$args = array(
'post_type' => 'post',
'posts_per_page' => 6,
'orderby' => 'rand', // ここを変えるだけで並び順が変わる
'order' => 'DESC',
);
$query = new WP_Query( $args );
if ( $query->have_posts() ) :
while ( $query->have_posts() ) : $query->the_post();
?>
<article>
<a href="<?php the_permalink(); ?>">
<?php the_title(); ?>
</a>
</article>
<?php
endwhile;
wp_reset_postdata();
endif;
?>wp_reset_postdata()はループ後に必ず書きましょう。これを忘れると、その後のグローバルな投稿データがおかしくなることがあります。
躓きやすいポイント
ランダム表示がキャッシュされて変わらない プラグインやサーバーのキャッシュが効いている場合、orderby => randにしてもページを読み込んでも順番が変わらないことがあります。キャッシュ除外設定を確認してみてください。
日本語タイトルをtitleで並び替えても意図した順にならない WordPressはタイトルをUTF-8の文字コード順で並び替えるため、漢字は読みではなく文字コード順になります。日本語コンテンツをタイトル順に正しく並べたい場合は、よみがなのカスタムフィールドを作ってmeta_valueで並び替えるのが確実です。
wp_reset_postdata()を忘れた カスタムループを使った後にwp_reset_postdata()を忘れると、the_title()やthe_permalink()などのテンプレートタグがカスタムループの最後の投稿のデータを参照してしまいます。ループの終わりには必ずセットで書く癖をつけておくと安心です。
まとめ
WP_Queryのorderbyパラメータを変えるだけで、投稿の並び順を自由にコントロールできます。
- 日付順 →
date+DESCorASC - ランダム →
rand - タイトル順 →
title+ASC - 更新日順 →
modified+DESC
「新着順しか知らなかった」という方も、ぜひ用途に合わせていろんなパターンを試してみてください。実装でわからないことがあれば、お気軽にご相談ください。
コーディングの委託・お仕事に関するお問い合わせはこちらからどうぞ。

