1つの記事のページを複数のカテゴリに出力する

MTQに以下のような質問が上がっていました。

ブログ記事を投稿するときに、複数のカテゴリに属していたら、それぞれのカテゴリにHTMLファイルを書き出すことは可能でしょうか。

同様の質問を過去に何度か見たことがあります。
この問題を、拙作の「WriteToFile」というプラグインで解決してみました。

1.WriteToFileプラグインのインストール

WriteToFileプラグインは、テンプレートの一部を、本来出力されるファイルとは別のファイルに出力するプラグインです。
プラグインは以下からダウンロードします。

WriteToFile_1_02.zip

Zipファイルを解凍したら、「plugins」というフォルダができます。
このフォルダを、Movable Typeのインストール先ディレクトリにアップロードします。
WriteToFileプラグインで追加されるテンプレートタグは、こちらのページを参照してください。

なお、今回のバージョン(1.02)ではなく、旧バージョン(1.00)をインストールされている方は、旧バージョンを削除してから、今回のバージョンをインストールしてください。

2.考え方

Movable Typeでは、個々の記事のページは、1つのアーカイブテンプレートにつき1回だけ出力される仕様です。
記事が複数のカテゴリに属していて、かつアーカイブマッピングでカテゴリから出力ファイル名を決めるようにしていたとしても、出力されるのは1回だけで、記事の主カテゴリのディレクトリに出力されます。

そこで、WriteToFileプラグインを使います。
ブログ記事のテンプレート全体をMTEntryCategoriesタグで囲み、記事が属する各カテゴリについてループさせます。
そして、そのそれぞれのカテゴリで、MTWriteToFileタグを使って、記事のページを出力します。
ただし、主カテゴリを処理するときは、前述したようにMovable Type本来の機能でページが出力されますので、その時はWriteToFileプラグインでは処理しないようにします。

3.テンプレートの組み方

具体的には、ブログ記事アーカイブテンプレートを以下のように組みます。

<mt:EntryPrimaryCategory>
  <$mt:CategoryID setvar="primary_cat_id"$>
</mt:EntryPrimaryCategory>
<mt:EntryCategories>
  <mt:If tag="CategoryID" eq="$primary_cat_id">
    <mt:SetVar name="out" value="1">
    <mt:SetVar name="no_file" value="1">
  <mt:Else>
    <mt:SetVar name="out" value="0">
    <mt:SetVar name="no_file" value="0">
  </mt:If>
  <mt:FileTemplate format="ファイル名のテンプレート" setvar="filename">
  <mt:WriteToFile file="$filename" archive_path="1" out="$out" no_file="$no_file">
元のブログ記事アーカイブテンプレートの内容
  </mt:WriteToFile>
</mt:EntryCategories>

「ファイル名のテンプレート」の部分には、以下の手順で調べた文字列を指定します。

  • 1.ブログ記事アーカイブテンプレートを開きます。
  • 2.「テンプレートの設定」のタブをクリックして開きます。
  • 3.のアーカイブマッピング部分の、「パス」のドロップダウンをクリックして開きます。
  • 4.一番下の「カスタム」の選択肢を選びます。
  • 5.「パス」の欄に「%c」等の記号が表示されます。この文字列を指定します。