darudaru

だるだるしてるエンジニア

wordpressでプラグインなしで関連記事を表示させる

wordpressには関連記事を表示させるためにプラグインが多く存在しますが、プラグインを利用しないで関連記事を表示させるプログラムを紹介します。プラグインを使用しないのは、その方が軽いからです。

relation

わたしのブログでいう記事ページの下部に表示しているここの部分です。

ちなみに、なにを持って関連記事と呼ぶのかというところですが、今回は同じカテゴリの記事を指すことにします。

functions.php

/* 関連記事のデータを生成する */
function relation(){
  // 記事が紐づいているカテゴリを取得する
  $category = get_the_category();

  $option = array(
    'category' => $category[0]->term_id,
    'posts_per_page' => 5,  // 取得する記事数。自身の記事を除外するため表示させる記事数より多く設定しています
    'orderby' => 'date',
    'order' => 'DESC'
  );
  $posts = get_posts($option);

 // 自身の記事情報を取得する
  $post = get_post();
  $dispPost = array();
  foreach($posts as $value){
    $id = $value->ID;
    // 自身の記事は除外する
    if($id === $post->ID){
      continue;
    }
    $tmpPost['post_title'] = $value->post_title;
    // <img src="xxx.png" width="150px" height="150px" class="circle"> のhtmlタグを取得する
    $tmpPost['img'] = get_the_post_thumbnail($id, array(150, 150), array('class' => 'circle'));
    $tmpPost['url'] = get_permalink($id);
    $dispPost[] = $tmpPost;
  }
  // 4より記事数が多い場合は、4つまでで記事を切り出す
  if(count($dispPost) > 4){
    return array_slice($dispPost, 0, 4);
  }
  return $dispPost;
}

同じカテゴリの記事を最新のものから4件取得しています。自身の記事が、最新の記事の4件に含まれている場合があるため、最初に5件の記事を取得し、その後自身の記事がある場合は除外することで、4件のデータを返せるようにしています。

single.php

<?php get_template_part('relation'); ?>

関連記事の表示処理は別ファイルに切り出したため、single.phpではテンプレートの呼び出し処理だけを追加しています。

relation.php

<?php
  // functions.phpのrelation()を呼び出す
  $relation = relation();
  if(!empty($relation)){
?>
<article>
  <!-- カテゴリ名を取得する -->
  <h1><?php $cate = get_the_category(); echo get_cat_name($cate[0]->term_id); ?>の関連記事</h1>
  <ul>
  <?php foreach($relation as $relation_post): ?>
      <li>
      <?php if($relation_post['img'] !== ''):?>
        <p><a href="<?php echo $relation_post['url'] ?>"><?php echo $relation_post['img'] ?></a></p>
      <?php endif; ?>
       <p><a href="<?php echo $relation_post['url'] ?>"><?php echo $relation_post['post_title'] ?></a></p>
     </li>
  <?php endforeach; ?>
  </ul>
</article>
<?php
  }
?>

relation()で取得した記事データをforeachでぐるぐると回して表示しています。あとはスタイルはお好みで。

relation.phpでforeachの要素の値を$postの変数名にしていたのですが、wordpress内の変数名と被ってしまったのかうまく表示ができませんでした。他と被らなさそうな$relation_postと変数名を変えることで無事表示ができるようになりましたが、wordpressで独自でコードを書く場合には汎用的な名前の変数名を使うことは避けたほうがいいかもしれません。

また、もっと自身の記事と関連性の高い記事を表示させたい場合は、独自で実装するよりwordpressプラグインを使ったほうがいいと思います。「YARPP」というプラグインでは、カテゴリ、タグ、本文、タイトルに関連づく記事の表示が可能とのことですよ。高性能! 自分で実装しようとすると、DBの処理周りなどどうしても複雑になってしまうので、プラグインを入れるほうが断然楽ですし、メンテナンスもしやすいと思います。