「SimilarEntries」プラグインは、Movable Typeに関連記事リストを表示するプラグインです。

https://github.com/bit-part/mt-plugin-SimilarEntries

タグ・カテゴリー・キーワード・カスタムフィールドの値を複合的に参照できるだけでなく、JavaScriptで生成するため、スタティック・パブリッシングでも利用できます。


導入には、複数のテンプレート追加・編集が必要となります。手順を解説します。


全般の注意点

JSON形式でテンプレートを生成する際、コードに改行・クオート・余分な空白が含まれているとシンタックスエラーとなります。
このため、サンプルコードでも「trim」「encode_html」モディファイアでエンコードを行っています。

後半の関連記事リスト前後のHTMLは、JSONに直接値を渡すため、MT6.2から追加された「encode_json」モディファイアを使用しています。
MT6.1以前に導入する場合は「encode_html」で代用してください。

1. 関連情報のテンプレートを作成する

最初に、関連情報のJSONファイルのテンプレートを作成します。
SimilarEntries.relate.json」という名前のインデックステンプレートを作成し、出力ファイル名を「SimilarEntries/relate.json」としてください。

テンプレート名、出力ファイル名とも任意で構いません。ここではわかりやすく、既存ファイルとかぶりにくい内容にしています。公開設定は、cronが使えるのであれば「公開キュー」をお勧めします。

テンプレートには以下のコードを記述してください。

<mt:SimilarEntriesRelateJSON
    include_blogs="1,2,3"
    fields="tags,keywords,category" />
「include_blogs」モディファイア
関連付けチェックの対象とするブログIDをカンマ区切りで入力してください。下記のようにMTMLで取得し、変数として渡す手もあります。
ウェブサイトと子ブログのIDを自動的に取得する | MovableType | CMSテクニック集 | CM3S
「fields」モディファイア
対象とする情報を指定します。タグ・キーワード・カテゴリーの他に、「field.カスタムフィールドのベースネーム」と記載することで、カスタムフィールドの値も参照できます。

2. 記事繰り返し部分のテンプレートを作成する

続いて、関連記事リストの記事繰り返し部分のテンプレートを作成します。
SimilarEntries.template.json」という名前のインデックステンプレートを作成し、出力ファイル名を「SimilarEntries/template.json」としてください。 テンプレート名、出力ファイル名、公開設定とも先ほどと同じです。

テンプレートには以下のコードを記述してください。

<mt:SimilarEntriesTemplateJSON include_blogs="1,2,3">
    <li><a href="<mt:EntryPermalink />"><mt:EntryTitle encode_html="1" /></a></li>
</mt:SimilarEntriesTemplateJSON>
「include_blogs」モディファイア
前項と同じ値を指定してください。
「mt:SimilarEntriesTemplateJSON」タグ内
繰り返し部分のMTMLを記述します。ここでは、Entries関連のタグをすべて利用でき、アセットやカスタムフィールドの値も参照できます。

3. 記事テンプレートをカスタマイズする

アーカイブテンプレートの「記事」の編集画面を開き、関連記事リストを表示したい箇所に以下のコードを記述してください。
モディファイアが多数あります。複雑なものは、事前に「mt:SetVarBlock」で変数化することをお勧めします。

<mt:TemplateNote value="関連記事情報のJSONのURL" />
<mt:SetVarBlock name="__similar_relation_url__">
    <mt:BlogURL />SimilarEntries/relate.json
</mt:SetVarBlock>
<mt:Var name="__similar_relation_url__" encode_html="1" trim="1" setvar="__similar_relation_url__" />

<mt:TemplateNote value="関連記事ループ部分のJSONのURL" />
<mt:SetVarBlock name="__similar_template_url__">
    <mt:BlogURL />SimilarEntries/template.json
</mt:SetVarBlock>
<mt:Var name="__similar_template_url__" encode_html="1" trim="1" setvar="__similar_template_url__" />

<mt:TemplateNote value="関連記事開始前のHTML" />
<mt:SetVarBlock name="__similar_first__">
<div class="similar">
    <div class="similar-header">
        <h2 class="similar-title">関連記事</h2>
    <!-- /.similar-header --></div>

    <div class="similar-contents">
        <ul>
</mt:SetVarBlock>
<mt:Var name="__similar_first__" encode_json="1" setvar="__similar_first__" />

<mt:TemplateNote value="関連記事終了後のHTML" />
<mt:SetVarBlock name="__similar_last__">
        </ul>
    <!-- /.similar-contents --></div>
<!-- /.similar --></div>
</mt:SetVarBlock>
<mt:Var name="__similar_last__" encode_json="1" setvar="__similar_last__" />

<mt:SimilarEntriesShow
    fields="tags,keywords,category"
    priority="tags:10,keywords:3,category:1"
    relation_url="$__similar_relation_url__"
    template_url="$__similar_template_url__"
    target_selector="#similar-entries-01"
    limit="5"
    first="$__similar_first__"
    last="$__similar_last__" />

<div id="similar-entries-01"></div>
「fields」モディファイア
「mt:SimilarEntriesRelateJSON」と同じ値で構いません。関連付けデータではすべての情報を取得しておき、表示部分ではタグの関連記事リスト、カスタムフィールドの関連記事リスト…と出し分けることも可能です。
「priority」モディファイア
関連度評価の優先度です。大きいほど一致したときにリストに出やすくなります。カテゴリーの優先度を高くすると、どの記事も同じリストになりがちです。1、もしくは指定しないことをお勧めします。
「relation_url」モディファイア
関連付けデータのJSONのURLを指定します。
「template_url」モディファイア
記事繰り返し部分のURLを指定します。
「target_selector」モディファイア
jQueryのセレクタの書式で、リストを表示する要素名を指定します。
「limit」モディファイア
表示件数を指定します。指定がなければ10件となります。
「first」モディファイア
開始前のHTMLを指定します。必ずエンコードしてください。
「last」モディファイア
終了後のHTMLを指定します。必ずエンコードしてください。

プラグイン内のJavaScriptを移動する

関連記事リストを表示する際は、「SimilarEntries」プラグインの下記ファイルを参照します。

(Movable Type管理画面のURL)mt-static/plugins/SimilarEntries/js/SimilarEntries.js

Movable Typeの設置URLを隠したい場合は、SimilarEntries.jsファイルを移動したうえで、以下の通りパスを明示してください。

<mt:SimilarEntriesShow
・・・
    script_url="(移動先のURL)" />

数件ごとにHTMLを挿入する

段組などで、エントリー数件ごとにHTMLを挿入したい場合は、以下の通り追加関数を指定することができます。

関数内の変数の「i」は件数、「text」はその時点での出力結果です。「odd」「even」は奇数、偶数の際にtrueとなります。

<mt:TemplateNote value="3件ごとにrowを閉じる" />
<mt:SetVarBlock name="__similar_function__">
function(i, text, odd, even){
    if (i % 3 == 0) {
        text += "<!-- /.row --></div><div class=&quot;row&quot;>"
    }
    return text;
}
</mt:SetVarBlock>

<mt:SimilarEntriesShow
・・・
    each_function="$__similar_function__" />

サーバーのセキュリティエラーが発生するため、サンプルコードではシングルクォーテーションを書かないようにしています。
text += "<!-- /.row --></div><div class=&quot;row&quot;>"」の「"」がシングルクォーテーションであれば、「&quot;」はダブルクォーテーション直書きでも構いません。

補足

より安全にJSONを生成したい場合は、空白・改行の除去レベルを細かく指定できる「compress modifier」プラグインの併用をお勧めします。

https://github.com/bit-part/compress-modifier