特定のカテゴリの記事だけ2種類のページを出力する

mixiのMovable Typeのコミュニティで、以下のような質問が出ていました。


ある特定のカテゴリに属したブログ記事だけ、2つの違ったフォーマットでページを出力したい

Movable Typeの標準機能だけではそのようなことはできませんが、擬似的に行うことは可能です。
その方法を紹介します。

1.ブログ記事アーカイブテンプレートを2種類作る

まず、ブログ記事アーカイブテンプレートを2種類作ります。
また、それぞれのアーカイブマッピングが別になるようにして、出力ファイル名が重複しないようにします。

例えば、以下のように2種類のブログ記事アーカイブテンプレートを作ります。
このようにすると、「ブログ記事」のテンプレートからは、「~/年/月/記事のベースネーム.html」のようなファイルが出力されます。
また、「ブログ記事2」のテンプレートからは、「~/年/月/記事のベースネーム-2.html」のようなファイルが出力されます。

用途テンプレート名アーカイブマッピング
すべてのブログ記事で使うテンプレートブログ記事yyyy/mm/entry-basename.html
特定のカテゴリのブログ記事だけで使うテンプレートブログ記事2%y/%m/%-b-2.html

2.エラーページへのリダイレクト

前述したように、「特定のカテゴリだけブログ記事アーカイブページを出力する」ということはできません。
1.のように2種類のテンプレートを作れば、すべてのブログ記事に対して、2種類のページが出力されます。

そこで、2種類目の(特定のカテゴリだけで使う)ページにアクセスがあったら、エラーページにリダイレクトするように、2種類目のブログ記事テンプレートを組むようにします。

例えば、A/B/Cの3つのカテゴリがあって、カテゴリAの記事だけ2種類のアーカイブページを出力したいとします。
この場合、カテゴリBとCの2種類目のアーカイブページにアクセスがあった場合に、エラーページへリダイレクトするように、テンプレートを組みます。

上にあげたような場合だと、2種類目のブログ記事アーカイブページのテンプレートを、以下のように組みます。

<MTSetVarBlock name="cat_label"><$MTEntryCategory$></MTSetVarBlock>
<MTIf name="cat_label" eq="カテゴリAの名前">
  カテゴリAのブログ記事の2種類目のブログ記事アーカイブページを出力する処理
<MTElse>
  エラーページへリダイレクトする処理
</MTIf>

「エラーページへリダイレクトする処理」の部分ですが、2種類目のブログ記事アーカイブページをhtmlファイルとして出力するなら、metaタグを利用して以下のようにすると良いでしょう。

<html>
<head>
<meta http-equiv="refresh" content="0; エラーページのアドレス">
</head>
<body>
</body>
</html>

また、2種類目のブログ記事アーカイブページをphpファイルとして出力するなら、「エラーページへリダイレクトする処理」の部分を以下のようにして、phpのheader関数を使ってリダイレクトすることができます。

<?php header('Location: エラーページのアドレス'); ?>

3.プラグインを作ればスマートに解決可能

Movable Typeの標準機能だけで問題を解決しようとすると、ここまでであげたような手順になります。
しかし、プラグインを使えば、もっとスマートに解決することができます。

「build_file_filter」というタイプのプラグインを作ると、「特定の条件を満たす場合はテンプレートを再構築しない」というようにすることができます。
これを利用して、「カテゴリがAのブログ記事のみ、ブログ記事テンプレートXを再構築する」といった処理をすることができます。

4.WriteToFileプラグインを使う方法も

もう1つの方法として、先日公開したWriteToFileプラグインを使う方法もあります。
以下のように、通常のブログ記事アーカイブテンプレートに、特定のカテゴリだけ出力したい部分を入れ、その部分をMTWriteToFileタグで囲んで、別ファイルに出力するようにすることが考えられます。

・
・(ブログ記事テンプレートの内容)
・
<MTSetVarBlock name="cat_label"><$MTEntryCategory$></MTSetVarBlock>
<MTIf name="cat_label" eq="カテゴリAの名前">
  <MTSetVarBlock name="fname">出力ファイル名を決める処理</MTSetVarBlock>
  <MTWriteToFile file="$fname">
    カテゴリAのときだけ出力したい内容
  </MTWriteToFile>
</MTIf>