【WordPress】プラグインなしでタグとカテゴリに基づいた関連記事を表示させることにしました

これまで「Yet Another Related Posts Plugin(YARPP)」というプラグインを使っていたのですが、このたびプラグインなしの関連記事を実装してみました。

実装してみましたと言いつつ、検索でヒットしたコードをほとんどそのまま使わせてもらっているだけです。そのため、内容についてお問い合わせいただいても恐らく答えられないので、あらかじめご了承ください(汗)

「YARPP」が悪かったわけではない

当ブログ開設時からお世話になっている「YARPP」。200,000件以上のインストール数がある人気ワードプレスプラグインです。タイトルや内容、カテゴリ、タグなどをもとにした関連記事を簡単に表示させられるため重宝していました。

では、なぜ今回「YARPP」を使うのをやめたのかというと、単純にプラグインの数を減らしたかったからです。ブログ開設当初は非常に多くのものを利用していましたが、徐々にプラグインを使わずできることは使わずにやろう、という考えになってきました。

それでも長らく「YARPP」を使っていたのは、代替方法が分からなかったからです。カテゴリ単体、あるいはタグ単体の関連記事を表示させる方法は見つけられたのですが、カテゴリとタグの両方に対応した方法は見つけられなかったのです。

「teratail」に良さげなコードが

しかし、昨日久しぶりに検索してみたら「teratail」というQ&Aサイトで良さげなコードが載っていました。そこで回答されていたコードを全部掲載するのはさすがに気が引けるので、リンクを張っておきます。

これのベストアンサーに選ばれているコードを使うと、次のような動作が期待できます。

[希望動作]
①同一タグの記事をランダムに取得する。
②同一カテゴリの記事をランダムに取得する。

①②の条件にて合計で最大10件表示したいです。

[理想の動作例]
・ ①にて6件記事を取得をできた場合は残り4件を②より4件取得する。
・①にて10件記事を取得をできた場合は残り0件を②より0件取得する。

PHP – WordPressの関連記事のカスタマイズについて。(16550)|teratail

まず、HTMLのマークアップ部分を除き、コードをそのままコピペして表示されるか試してみました。無事エラーも出ずに表示されたのですが、当ブログにおいては次の2点を改善したいなと思いました。

  1. 同一タグを持つ記事が最大表示件数に満たなかった場合、同一カテゴリの記事からランダムで残り件数分の記事が表示されるが、既に同一タグを持つ記事として表示された記事も対象となってしまう。簡単に言えば、同じ記事が2つ表示される可能性をはらんでいる。
  2. 現在読んでいる記事にタグが設定されていなかった場合、同一カテゴリではなく全カテゴリの記事からランダムに表示されてしまう。

1番目については‘tag__not_in’ => $tag_idsを加えることで、2番目についてはhas_tag()関数を用いて条件分岐させることで解決しました。

これらの追記場所は次のとおり。

<?php
  // 総件数
  $max_post_num = 12;

  // 現在の記事にタグが設定されている場合
  if ( has_tag() ) {

    // 1.タグ関連の投稿を取得
    (中略)
    // 総件数よりタグ関連の投稿が少ない場合は、カテゴリ関連の投稿からも取得する
    (中略)
        // 取得件数は必要な数のみリクエスト
        $cat_args = array(
            'post__not_in' => array($post -> ID),
            'tag__not_in' => $tag_ids,
            'posts_per_page'=> ($max_post_num - $rel_count),
            (中略)
        $rel_posts = array_merge($rel_posts, $cat_posts);
    }

  } else { // 現在の記事にタグが設定されていない場合
        省略
       「総件数より~カテゴリ関連の投稿からも取得する」以下のコードと同じ。
        ただし、こちらでは'tag__not_in' => $tag_ids,を追記せず。
        また、  
        $rel_posts = array_merge($rel_posts, $cat_posts);ではなく
        $rel_posts = $cat_posts;と記述。

  }
    
?>

赤色のコードが元のコードに加えて記述したものです。中略やら省略やらでたいへん見づらくなっていますが、あくまで追記場所の紹介ということで。具体的なコードは、上でリンクを張っている「teratail」のページでご確認ください。

完成形

「YARPP」を使っていた時とHTMLのマークアップが同じなので見た目は変わりません。

ワードプレスプラグインを使わない関連記事

これは<雑記>カテゴリに属し、<沖縄旅行>というタグ(ブログ内で全7件)を設定した記事における関連記事エリアです。

画像内テキストにあるように、最初の6記事は<沖縄旅行>をタグに持つ記事です。画像では途切れていますが、残りの6記事は<雑記>カテゴリ(同一カテゴリ)の中からランダムで選ばれたものとなっています。

現在はランダム表示ですが、投稿の新しい順番に並び替えたり、他にもパラメータ次第でいろいろと調整できそうですね。