BBH
-Biz Branding Hub-
投稿日 : 
2019/08/23
更新日 : 
2019/08/23

WordPressで関連記事を取得する方法

WordPressで直使う処理として、「その記事に関連する記事を取得する」というものがあるかと思います。
例えば、記事下の関連記事とかおすすめ記事みたいなパーツでよく使われますね。

ソースコード

関連記事とひとくちに行っても様々な条件があるかと思います。
・同じカテゴリの記事
・同じタグの記事
・その両方
・今の記事を読んでいる人が良く読む記事
など

今回は、一番簡単な同じカテゴリの記事を取得するパターンを考えてみます。

single.php

<?php
	// 同じカテゴリから記事を4件呼び出す
	$categories = get_the_category();
	$category_ID = array();
	foreach($categories as $category):
		array_push( $category_ID, $category->cat_ID);
	endforeach ;
	$args = array(
		'post__not_in' => array($post->ID), // 現在の記事を除く
		'posts_per_page'=> 4,
		'category__in' => $category_ID,
		'orderby' => 'rand', // ランダムに記事を選ぶ
	);
	$related_posts = get_posts($args);
?>
<?php if($related_posts) { ?>
	<div class="RelatedArticle_Div">
		<div class="RelatedArticle">
			<p class="RelatedArticle_Title">Related Posts</p>
			<ul class="RelatedArticle_ul">
				<?php // ========== 1記事 - Start ========== ?>
				<?php 
					$count = 1; 
					foreach($related_posts as $post): setup_postdata($post);
				?>
					<li class="RelatedArticle_li">
						<a href="<?php the_permalink(); ?>" class="RelatedArticle_Cover_A" />
						<div class="RelatedArticle_li_Inner_Div">
							<a href="<?php the_permalink(); ?>" class="RelatedArticle_thumbnail_a">
								<p class="RelatedArticle_thumbnail_img" style="background-image:url(<?php echo the_post_thumbnail_url('medium'); ?>);"></p>
							</a>
							<div class="RelatedArticle_Info">
								<div class="RelatedArticle_Info_Title">
									<div class="RelatedArticle_Info_Title_Cell">
										<a class="RelatedArticle_Info_Title_a" href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
									</div>
								</div>
							</div>
						</div>
					</li>
				<?php
					if($count % 2 == 0) {
						// 偶数時にfloat解除
						echo '<li class="RelatedArticle_Reset"></li>';
					}
					endforeach;
					if($count == 1) {
						// 1記事しかない場合もfloat解除
						echo '<li class="RelatedArticle_Reset"></li>';
					}
					wp_reset_postdata();
				?>
				<?php // ========== 1記事 - End ========== ?>
				
			</ul>
		</div>
	</div>
<?php } ?>

処理解説

関連記事の取得

同じカテゴリの記事を取得するので、まずは現在の記事のカテゴリを取得する必要があります。
これは、get_the_category() で取得することができます。
ここで注意が必要なのが、カテゴリーは複数紐づく可能性があるということです。
取得できたカテゴリーは配列となりますので、その前提で以降の処理を行う必要があります。

次に、そのカテゴリと同じカテゴリを取得します。
これは、get_posts()で実現することができます。
get_posts()のパラメータとして、$argsで作成しています。
このパラメータは上記の例以外にもいろいろな指定ができますので、ご自身の取得条件に合わせて適宜変更してください。

パラメータについては以下を参照ください。
関数リファレンス/get pages - WordPress Codex 日本語版
※get pagesになっていますが、パラメータは同じになります。

HTML生成

関連記事を取得できたら、次にそれをもとにHTMLを生成していきます。
ここはデザインにもよると思いますが、今回は例として当サイトのHTML生成処理を見ていきます。

まず、取得した記事をforeachで回して1記事ごとのHTMLを生成していきます。
1記事ごとのHTML要素は、「// ========== 1記事 - Start ==========」から「// ========== 1記事 - End ==========」の部分になります。

the_permalink()でその記事へのリンクを取得しています。
the_permalink()とは、$postの記事のリンクを取得する処理です。
foreachで$postに記事を代入しているので、その記事のリンクを取得することができます。

サムネイルのリンクは、the_post_thumbnail_urlで取得することができます。
この関数は引数でサムネイルのサイズを指定することができます。
今回は、そこまで大きく表示しないので、thumbnailを指定したいところですが、thumbnailだとアスペクト比(縦横比)を保ってくれません。
強制的に短編が150pxになるように圧縮され、はみ出た部分はカットされてしまいます。
なので、mediumを採用しています。

ちなみに引数の種類としては、thumbnail, medium, large, fullを指定できます。
(それぞれ、150px、300px、640px、オリジナルサイズとなります。)
これらはあらかじめWordPress側で用意されたサイズになります。
これらのサイズでは事足りない場合は、

php

the_post_thumbnail_url( array(100, 100) );	 // width:100px,height:100pxで画像を取得


のような形式で、直接指定することもできます。
しかし、リサイズしてくれるわけではなく、そのサイズの画像が既にある場合にしか使えません。

引数についての詳細は以下を参照ください。
Function Reference/the post thumbnail url ≪ WordPress Codex

php

<?php
	if($count % 2 == 0) {
		// 偶数時にfloat解除
		echo '<li class="RelatedArticle_Reset"></li>';
	}
	endforeach;
	if($count == 1) {
		// 1記事しかない場合もfloat解除
		echo '<li class="RelatedArticle_Reset"></li>';
	}
	wp_reset_postdata();
?>

の部分は、float解除に関する処理なので、今回の処理の本筋とは外れます。
内容的には、横2列にfloat表示したいので、2列表示するごとにfloatを解除しているというものになります。

Profile

管理人プロフィール

都内でITエンジニアをやってます。
変遷:中規模SES→独立系SIer→Webサービス内製開発
使用技術はその時々でバラバラですが、C#、AWSが長いです。
どちらかと言うとバックエンドより開発が多かったです。
顧客との折衝や要件定義、マネジメント(10名弱程度)の経験あり。
最近はJava+SpringBootがメイン。

Recommend