【WordPress】一覧ページで記事をランダムに表示する

WordPress

WordPressの一覧ページで記事をランダムに表示する方法を紹介します。

通常のブログサイトだともしかしたらあまり出番はないかもしれませんが、固定の表示順にしたくない場合などに使用することがあります。

スポンサーリンク

メインループを使用する

記事表示用ファイル index.php、archive.php 等

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>
<h1><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h1>
<?php the_content(); ?>
<?php endwhile; ?>
<?php else: ?>
<p>記事が見つかりませんでした。</p>
<?php endif; ?>

記事を表示させたいファイルに上記の記事表示用のループを追加します。
例:index.php、archive.php 等

表示部分はお好みで変更してください。

functions.php

function rand_posts( $query ) {
  // 指定したページとメインクエリの場合に限定
  if ( $query->is_archive() && $query->is_main_query() ) {
    $query->set( 'orderby', 'rand' ); // 表示順をランダムに
    $query->set( 'posts_per_page', '-1' ); // 全件表示
  }
}
add_action( 'pre_get_posts', 'rand_posts' );

functions.phpに上記記述を追加します。
他のページに影響が出ないようにifで表示するページを指定しています。

上記はカテゴリページなどのアーカイブページ用となっていますが、is_archive()の部分を変更すれば、任意のページで使用可能です。
例:is_home()に変更すればトップページがランダム表示になります。

WP_Query を使用する

記事の一覧を取得する場合、通常はメインループを使用しますが、固定ページの中に記事一覧を表示したりしたい場合などには、WP_Queryを使用したループを使います。

<?php
$args = array(
  'orderby' => 'rand', // ランダム表示にする
  'posts_per_page' => 5 // 表示する記事数
);
$the_query = new WP_Query( $args );
if ( $the_query->have_posts() ) :
?>
<?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
<h1><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h1>
<?php the_content(); ?>
<?php endwhile; ?>
<p>記事が見つかりませんでした。</p>
<?php endif; wp_reset_postdata(); ?>

こちらも表示部分はお好みで変更してください。

2ページ目以降が重複する

ロード時にランダムで記事を取得してくるため、記事数が多い場合2ページ目以降に表示される記事が重複してしまう仕様となっています。

表示する記事数を限定するか、 posts_per_page に -1 を指定することで、1ページにすべての記事を表示させることができるので、ランダム表示を使用する際は併せて設定しておきましょう。

よくある質問(FAQ)

Q. WordPressで記事をランダムに表示するにはどうすればよいですか?
A. WP_Queryの引数にorderby => "rand"を設定します:$query = new WP_Query(["orderby" => "rand", "posts_per_page" => 5]);。ただしランダムはキャッシュと相性が悪く、表示のたびにDBクエリが発生します。パフォーマンスが重要な場合はトランジェントAPIでキャッシュします。
Q. ランダム表示とキャッシュを両立させるにはどうすればよいですか?
A. set_transient()で結果をキャッシュします:$posts = get_transient("random_posts"); if(!$posts){ $posts = get_posts(["orderby"=>"rand", "numberposts"=>5]); set_transient("random_posts", $posts, 3600); }で1時間キャッシュします。Cocoonなどのキャッシュ機能があるテーマはキャッシュ設定で除外が必要な場合もあります。
Q. カテゴリを指定してランダム表示するにはどうすればよいですか?
A. WP_QueryにcategoryパラメータとorderbyのrandArrayを組み合わせます:new WP_Query(["cat" => 5, "orderby" => "rand", "posts_per_page" => 3]);。カテゴリスラッグで指定するには"category_name" => "スラッグ"を使います。