【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ページにすべての記事を表示させることができるので、ランダム表示を使用する際は併せて設定しておきましょう。