WordPressで既存記事を固定ページにランダム表示する

WordPressで、任意の固定ページにより処理を分け、例えば表示を変えるなどをしたい時があります。

例えば、Web集めにて、ランダム機能というものをテスト設置したのですが、この時に使ったやり方をメモとして書いておきます。

固定ページかそれ以外で分ける

WordPressは超基本かもしれませんが、特定のHTMLファイルというのが静的にはありません。多分ないというと正確ではないんですが、あるのはphpプログラムでテンプレートやらに従ってHTMLを生成しているということなんですよね。

WordPressで特定の固定ページにだけ表示させる場合に使う「is_page」を参考にして、そもそもWordpressは固定ページと投稿(post)で異なります。今回は、固定ページに対してランダム機能を入れてみるというものなので、is_page関数を使えば良さそうです。(ちなみに投稿記事はis_single()のはずです。両方ならis_singular()らしい)

また、特定のページ、任意のページといっているのは、固定ページが1ページなら振り分けはいりませんが、普通は複数固定ページがあるはずなので、その中のどれかに対して設定するということになります。

今回Web集め上に、ランダムという固定ページを作りました。実際のページはこちらです。

振り分け自体は、is_page()の引数に、ページ自体のIDを入れる必要があります。このページのIDは、Wordpress管理画面の固定ページ一覧で、マウスを記事に当てると出てきます。post=xxxのxxxが該当するIDです。2038でしたので、このページを振り分けるコードは以下となります。

<!-- 固定ページで処理分岐 -->
<?php if(is_page( '2038' )): ?>
特定の処理
<?php else: ?>
通常時
<?php endif; ?>

みたいな感じです。これを例えばpage.phpなどの固定ページテンプレート?に書けばオッケーとなります。

実際には、ここでいう通常時は既存処理であるので、Web集めでいえば掲載の仕方は固定ページですが、ランダム処理は当然されていません。同じ固定ページなんだけど、特定のページだけが処理をされていることがポイントです。

ランダム処理を実装する

WordPressでは記事自体はデータベースに入っているコンテンツであり、それらを簡単に取ってこれます。というかそういう処理をあちこちで動かしているので、記事一覧やカテゴリ毎というのが見えるというほうがいいかもしれませんね。

WordPressで記事をランダムに表示させる方法!プラグイン不要ですが、コード修正します。カテゴリ毎でも可

【WordPress】記事をランダムに表示させる方法

などが参考になります。それで、何も考えずにquery_posts()を使えばいいと思っていたら、調べてみると、

query_postsは非推奨?代わりにget_postsで条件指定!投稿を取得する方法【WordPress】

ということで、非奨励であり、WordpressCodexでも書かれています。テンプレートタグ/query posts

ざっくりいうと、使うなということです。メインループを変更する処理で時間かかるというところです。

WP_Queryの使い方で今回は行ってみましょう。ちなみに上の参考サイトでは、カンマが最後に余分な気がしました。

BADコード

<?php query_posts('cat=4&showposts=5&orderby=rand');?>

query_postsは多分ですが、メインループを変更したら戻すというイメージです。Codexにある図は英語ですけど、メインループはquery_postsで、そのループから取り出すような条件つまり普通はWP_Queryクラスを、それ以外で、投稿記事をメインで取りたい場合はget_posts()でみたいな図が書かれています。

これをしっかり理解してというところがやっていきながらでないと難しいですね。

今回のコード

<?php
	$the_query = new WP_Query( array(
		'orderby' => 'rand',
		'posts_per_page' => '5',
		'cat' => '4'
	) );
?>

WP_Queryクラスを用いて、この場合は$the_queryはインスタンスかなと思われますが、ランダムに5記事ずつ、Webサービスカテゴリから取ってくるというものになりました。

単にthe_posts()があるならその中身を表示してねというオーソドックスなものになるかなと思います。

<?php if ($the_query->have_posts()) : while ( $the_query->have_posts()) : $the_query->the_post(); ?>
		<h2><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h2>
		<div class="post"><?php the_content(); ?></div>
		<?php endwhile; ?>
	<?php else: ?>
		<h2>記事がありません</h2>
	<?php endif; ?>

記事がないことはありえないですが、絞り込みの条件がミスってたら気づけますし、そういう意味では保険的に書いています。

完成したコード

<!-- 固定ページで処理分岐 -->
<?php if(is_page( '2038' )): ?>

	<?php
	$the_query = new WP_Query( array(
		'orderby' => 'rand',
		'posts_per_page' => '5',
		'cat' => '4'
	) );
	?>
	<?php if ($the_query->have_posts()) : while ( $the_query->have_posts()) : $the_query->the_post(); ?>
		<h2><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h2>
		<div class="post"><?php the_content(); ?></div>
		<?php endwhile; ?>
	<?php else: ?>
		<h2>記事がありません</h2>
	<?php endif; ?>

<?php else: ?>

	<?php while ( have_posts() ) : the_post(); ?>
		<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
			<?php get_template_part( 'content', get_post_format() ); ?>
			<?php comments_template( '', true ); ?>
		</article>
	<?php endwhile; // end of the loop. ?>


<?php endif; ?>

みたいな感じです。これで特定の固定ページのみランダム記事を表示して、それ以外の固定ページはそのまま(既存処理)ということが出来ました。

おわりに

気になったのは、そもそもこういった実装においてpage.phpなどのテンプレートファイルをいじるのが適切かなんですよね。多分スキルの問題ですが、IF文が多層化したりしたら見づらいですし、そういう場合は多分テンプレートファイルを作ってそっちを見せるというのが適切な作りな気がします(例えばランダムページを見せるけどその中で処理が増えてきたら、random.phpみたいなテンプレートファイルを作り、page.phpからそっちへ飛ばすみたいなやつは確か出来たはずです)。

参考になれば幸いです。

良かったら、ランダムページも見てもらって、ページ自体を楽しめたらいいねも押してみてください。僕が喜びます(笑)

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