WP_Queryで投稿を日付順・ランダムに並び替える方法【WordPress】

WP_Queryで投稿を日付順・ランダムに並び替える方法 WordPress

WP_Queryで投稿の並び順を自由に変える

WordPressで「新着順じゃなくてランダムに記事を表示したい」「日付の古い順に並べたい」と思ったことはありませんか?

WP_Queryのorderbyパラメータを使えば、投稿の並び順を自由にコントロールできます。この記事では、日付順・ランダム・タイトル順など、よく使う並び替えパターンをコード付きで紹介します。

基本の書き方:orderbyとorderを組み合わせる

WP_Queryで並び順を指定するには、orderbyorderの2つのパラメータを使います。

$args = array(
    'post_type'      => 'post',
    'posts_per_page' => 6,
    'orderby'        => 'date',   // 並び替えの基準
    'order'          => 'DESC',   // DESC(新しい順)/ ASC(古い順)
);
$query = new WP_Query( $args );

各パラメータの解説

  • post_type:対象の投稿タイプ(postpage・カスタム投稿タイプ名など)
  • posts_per_page:取得する件数(-1で全件取得)
  • orderby:並び替えの基準(後述)
  • orderDESCが降順(大→小)、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のデフォルト動作なので、orderbyorderを省略しても同じ結果になります。

② 日付の古い順

$args = array(
    'post_type'      => 'post',
    'posts_per_page' => 6,
    'orderby'        => 'date',
    'order'          => 'ASC',
);

連載記事や手順を追って読む記事一覧などに使えます。orderASCに変えるだけで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 + DESC or ASC
  • ランダム → rand
  • タイトル順 → title + ASC
  • 更新日順 → modified + DESC

「新着順しか知らなかった」という方も、ぜひ用途に合わせていろんなパターンを試してみてください。実装でわからないことがあれば、お気軽にご相談ください。

コーディングの委託・お仕事に関するお問い合わせはこちらからどうぞ。

タイトルとURLをコピーしました