関連記事を表示する WordPress プラグインを比較

投稿記事に関連する記事へのリンクが自動で表示されるプラグインはいくつかあるのですが、関連スコアによる紐づけとかアルゴリズムがいまいちなのか、なかなか意図した関連記事が表示されませんでした。
すでに記事数が数千件とか膨大なサイトですと自動もやむなしとは思いますが、普通は関連記事は手動で設定するものではないかと思ってます。ブロガーにしてもユーザにしても、関連記事というラベルで意図しないリンクが自動で表示されてもうれしくないですよね。人気記事とかレコメンド(おすすめ)とか関連のないラベルにしておけば問題はないですが、自動の場合はその精度ですね。

ということで、投稿記事に関連する記事へのリンク自動・手動で表示するプラグインをいくつか調査してみました。主に「手動で設定できる」という観点から調査しています。詳細まで深くは触れていませんので、もしかしたら誤認識があるかもしれません。その際はご指摘くださいませ。

  • ■WordPress関連記事プラグイン

    「相互リンク」機能を簡単に説明しますと、記事元に関連記事を登録するとリンク先記事にもリンク記事元が自動で登録され、相互リンクとなります。
    例えばA記事、B記事があるとします。A記事からB記事へ関連記事をリンク登録したとします。するとB記事には自動でA記事への関連記事が登録されます。
    サイト外(他人)へのリンクであれば拒否られてしまい一方通行ということもありますが、サイト内の記事であれば普通は相互リンクでよいはずですよね。

  • ■WordPress関連記事系プラグインの表示例
    記事:「なぜシンガポールチャンギ空港は搭乗ゲートで手荷物検査をするのか?」の関連記事の表示例。
    「WordPress Related Posts」と「Yet Another Related Posts」は自動で抽出された関連記事。
    「Related Posts for WordPress」「BAW Manual Related Posts」「Microkid’s related posts」「Custom Post Types Relationships (CPTR)」は手動で2件の関連記事を登録。
    (デザインはいかようにもできるので比較対象外)
  • ■総評
    各プラグインを調査した結果、すべてのブラグインが独自テーブル(データベース)を作成し、関連記事情報を保存していました。わざわざテーブルに保存しているのなら、相互リンク機能ぐらいは必須のように思います。その点ではMicrokid’s related postsですかね。私は相互リンクが欲しいのでこのプラグインを常用します。

    しかしここで、1つの疑問が。結局のところ手動の場合、リンクですので記事下段にリンクを記述すればよいだけなのではないか、果たしてテーブル(データベース)にまで関連を保存する必要があるのかという、話の骨を根本から折るような疑問が(汗)。

    例えば以下のようなショートコードを記述すれば、タイトルと組み合わせてリンクを自動作成するようなシンプルなプラグインでよいのではないかと思います。実際このようなプラグインが存在するかは不明ですが、相互リンクなしの手動設定ならこの程度で十分な気がします。私は記事投稿では「テキスト」を使用しますが、「ビジュアル」の使用あれば、ツールバーに「関連記事」を追加できる項目ができる程度でよい気がします。

関連記事を手動で設定できる Custom Post Types Relationships (CPTR) WordPress プラグイン

関連記事を手動で設定できるWordPressプラグインを調べているのですが、Microkid’s related postsに続き「Custom Post Types Relationships (CPTR)」プラグインをインストールしてみました。バージョンはV.2.4.1。


Custom Post Types Relationships (CPTR)のインストール

  1. プラグインのインストール
  2. 設定画面
  3. 関連記事登録画面
    こちらも、関連記事を記事編集画面から設定できます。UIは非常によくできていてそれほど戸惑うことはありません。
  4. 関連記事の表示
    このプラグインは関連記事を登録しても記事末尾にはリンク表示されません。関連記事を表示するには、記事に以下のショートコードを記述する必要があります。記事のどの箇所にも関連記事を表示できますが、関連記事は通常記事末尾でよいですし、手動で記述するのは二度手間ですね。またこちらは関連記事の相互リンク機能もありませんでした。
    ショートコードのオプション詳細はこちら
    [cc] [cptr excerpt=0] [/cc] 抜粋を表示するオプション「excerpt=1」にしますと、設定した最大文字数以上に出力されてしまうようです。(v2.4.1)
    [cc] [cptr excerpt=1 words=10] [/cc]


  5. しばらく使用してみますと、こちらもMicrokid’s related postsと同様で、関連記事登録画面での検索「Filter」が正しく動作していないことがわかりました(v.2.4.1)。またまたソースを斜め読みすることに。
    こちらは「Filter」の検索ボックスが存在するのに「Filter」機能自体が実装されていませんでした。
    「Filter」機能を有効にするには以下の「cptr.php」、「cptr.js」の2ファイルに手を入れる必要があります。

    ソースコードは以下です。

    • ■cptr.php の cptr_cats() 関数
      • function cptr_cats() {
        	$post_type   = $_POST['cptr_post_type'];
        	$postID  = $_POST['postID'];
        	$howMany = $_POST['howMany'];
        	$orderBy = $_POST['orderBy'];
        	$orderIn = $_POST['orderIn'];
        
         		$args = array(
         			'post_type' => $post_type,
         			'numberposts' => $howMany,
         			'post_status' => 'publish',
         			'orderby' => $orderBy,
         			'order' => $orderIn,
         			'post__not_in' => array($postID)
         		);
        
      • ↓↓↓ 162,170行目を追加 ↓↓↓
        function cptr_cats() {
        	$post_type   = $_POST['cptr_post_type'];
        	$postID  = $_POST['postID'];
        	$howMany = $_POST['howMany'];
        	$orderBy = $_POST['orderBy'];
        	$orderIn = $_POST['orderIn'];
        	$filtered = $_POST['filtered'];
        
         		$args = array(
         			'post_type' => $post_type,
         			'numberposts' => $howMany,
         			'post_status' => 'publish',
         			'orderby' => $orderBy,
         			'order' => $orderIn,
         			's' => $filtered,
         			'post__not_in' => array($postID)
         		);
        
      • diff確認
        % diff -u cptr.php.org cptr.php
        --- cptr.php.org        2014-08-04 21:49:22.000000000 +0900
        +++ cptr.php    2014-11-15 13:31:14.000000000 +0900
        @@ -159,6 +159,7 @@
                $howMany = $_POST['howMany'];
                $orderBy = $_POST['orderBy'];
                $orderIn = $_POST['orderIn'];
        +       $filtered = $_POST['filtered'];
        
                        $args = array(
                                'post_type' => $post_type,
        @@ -166,6 +167,7 @@
                                'post_status' => 'publish',
                                'orderby' => $orderBy,
                                'order' => $orderIn,
        +                       's' => $filtered,
                                'post__not_in' => array($postID)
                        );
        
    • ■cptr.js
      • 		$.ajax({
        			type: "post",
        			url: AjaxHandler.ajaxurl,
        			data: { action: 'cptr-cats', cptr_post_type: $('#posttype').val(), postID: $('#h_pid').val(), howMany: $('#howmany').val(), orderBy: $('#orderby').val(), orderIn: $('#orderin').val()  },
        
      • ↓↓↓ 28行目に以下を追加 ↓↓↓
        [cc width=”300px” highlight=”1″] , filtered: $(‘#filtered’).val()
        [/cc]
        		$.ajax({
        			type: "post",
        			url: AjaxHandler.ajaxurl,
        			data: { action: 'cptr-cats', cptr_post_type: $('#posttype').val(), postID: $('#h_pid').val(), howMany: $('#howmany').val(), orderBy: $('#orderby').val(), orderIn: $('#orderin').val(), filtered: $('#filtered').val()  },
        
      • diff確認
        % diff -u cptr.js.org cptr.js
        --- cptr.js.org 2014-08-04 21:49:22.000000000 +0900
        +++ cptr.js     2014-11-15 13:33:11.000000000 +0900
        @@ -25,7 +25,7 @@
                        $.ajax({
                                type: "post",
                                url: AjaxHandler.ajaxurl,
        -                       data: { action: 'cptr-cats', cptr_post_type: $('#posttype').val(), postID: $('#h_pid').val(), howMany: $('#howmany').val(), orderBy: $('#orderby').val(), orderIn: $('#orderin').val()  },
        +                       data: { action: 'cptr-cats', cptr_post_type: $('#posttype').val(), postID: $('#h_pid').val(), howMany: $('#howmany').val(), orderBy: $('#orderby').val(), orderIn: $('#orderin').val(), filtered: $('#filtered').val()  },
                                beforeSend: function() {$("#available-posts").html('Loading...');},
                                success: function(response){
                                        //dump the list with post from the category selected