みなさん、Movable Typeでブログ記事を書くときにタグを使っていますか?
ブログを書いてタグを設定すると、欲しくなるページですよね。
でも、Movable Typeにはなぜか標準では作れません。カテゴリーアーカイブのように簡単に作れそうなものですが、なぜかできません。
実際は「mt-search.cgi」の検索機能を利用して、タグアーカイブのようなタグが設定されているブログ記事の一覧を表示することができます。公式ドキュメントにもあるように<$mt:TagSearchLink$>
を使います。
- MTTags - テンプレートタグリファレンス(Movable Type)
URLは「[Movable Typeのインストールパス]/mt-search.cgi?tag=DTP&blog_id=1」といった感じで、いかにも検索していますというURLになります。
Movable Type 7がリリースされたことで、ブログの機能は今後新たに開発されることは難しいでしょうから、検索機能を利用してなんとかするというのがこれからも普通の方法となるのでしょう。技術がある方は、Data APIを利用したり、JSONを書き出しておいて、一覧ページを作成するということもできるのでしょうが、私は正直そこら辺はあんまり詳しくありません(笑)。
なので、無理矢理でも普通のMovable Typeのタグ(MTML)を使ってなんとかできないかなと、調べていたら、Movable Type界の大御所の藤本 壱さんのプラグイン「WriteToFile」を見つけました。
このプラグインはテンプレートで構築した結果の一部をファイルに出力するプラグインです。
WriteToFileプラグインの基本的な使い方
WriteToFileプラグインをインストールすると <mt:WriteToFile>
というタグが使えるようになるので以下のように記載することで、 <mt:WriteToFile>
タグ内に囲まれた部分がファイルとして出力されます。
<mt:WriteToFile file="出力先ファイル名"> ファイルに出力する内容 </mt:WriteToFile>
簡単!
また、overwriteモディファイアは overwrite="1"
とすることでファイルを上書きします。
テンプレートコードサンプル
インデックステンプレートに「タグアーカイブページを生成」と名前を付けて以下のテンプレートコードで保存します。
出力ファイル名は、「tag/index.html」としておきます。(ほかのファイルと重複しないように設定してください)
なお、テンプレートコードは「タグ」が付いた記事の一覧ページをhtmlで作りたい(MTQ | Movable Type ユーザーコミュニティ)のぴろりさんのコードをほぼそのまま使っています。
<mt:Entries lastn="0"> <mt:EntryIfTagged> <mt:EntryTags> <$mt:TagName setvar="tag_name"$> <mt:SetVarBlock name="entry_title"> <dt><$mt:EntryDate format="%Y-%m-%d"$> 公開</dt> <dd><a href="<$mt:EntryPermalink$>"><$mt:EntryTitle remove_html="1" encode_html="1"$></a></dd> </mt:SetVarBlock> <mt:SetVar name="data{$tag_name}" value="$entry_title" append="1" /> </mt:EntryTags> </mt:EntryIfTagged> </mt:Entries> <mt:loop name="data"> <mt:SetVarBlock name="tag_archive_name">tag/<$mt:Var name="__key__"$>/index.html</mt:SetVarBlock> <mt:WriteToFile file="$tag_archive_name" overwrite="1"> <!DOCTYPE html> <html lang="ja"> <head> </head> <body> <article> <h1><$mt:Var name="__key__"$></h1> <dl> <mt:Var name="__value__" /> </dl> </article> </body> </html> </mt:WriteToFile> </mt:loop>
これで「ウェブサイトパス/tag/タグ/index.html」ファイルが作成されます。
テンプレートコード解説
前半の方では、<mt:Entries lastn="0">
で、すべての記事を対象にして、タグが付いている記事に対して、タグの付いている回数ループを回します。書き出したいHTMLに整形して、その結果をハッシュに入れていきます(data{タグ}
)。
後半の方では、<mt:loop name="data">
でハッシュをすべてループさせて処理しています。
<mt:SetVarBlock name="tag_archive_name">tag/<$mt:Var name="__key__"$>.html</mt:SetVarBlock>
でパスとファイル名を決定します。
次に<mt:WriteToFile file="$tag_archive_name" overwrite="1">
でそのパスとファイル名で書き出します。
<mt:WriteToFile>
のタグの中はそれだけでHTMLとして成り立つように記述します。(<mt:Include>
タグなども使えます)
タグアーカイブを静的ページにするメリット
- mt-search.cgiの検索機能を使わないため、Movable TypeのCMSのサーバーと公開ウェブサーバーが別になっていてもタグアーカイブが表示できます。
- 静的ページなので、データベースへのアクセスもなく、サーバーへの負荷が極めて低く、表示も高速です。
考えられるデメリット
このインデックステンプレートは、すべての記事のタグを処理をする設定になっているため、サーバーの状況によっては時間が掛かって処理しきれずに「500 Internal Server Error」が発生するおそれがあります。
このため、公開(公開プロファイル)は「スタティック」ではなく、「手動」か「公開キュー」にしておき、ブログ記事の公開・更新と同時に再構築しないようにしておく方が良いのではないでしょうか。(現在使用しているエックスサーバー(FCGI環境)は、私のタグ数程度(約2000)であれば問題ありませんでした)
また、ブログ記事からタグを削除して、該当するタグがなくなった場合に、書き出したタグアーカイブファイルを削除する方法がないので、更新されないファイルが残ってしまいます。(ファイルマネージャー・ターミナル・FTPなどで削除するしかない)
まとめ
WriteToFileプラグインを使うことで、今まで静的なページとして書き出せなかったものが書き出せるようになりました。HTMLだけでなく、CSV、JSONなどのファイルを書き出して利用することもできます。
またひとつのインデックステンプレートで複数のファイルを書き出せるので、効率の良いファイルの書き出しも可能になっています。
ぜひ使ってみてくださいね。
それではよいMovable Typeライフを。
関連情報・参考資料
- MovableTypeにタグクラウド(SEO対策済み)を設置する(to-R)
- 「タグ」が付いた記事の一覧ページをhtmlで作りたい(MTQ | Movable Type ユーザーコミュニティ)
- コンテンツをファイルに書き出す MovableType プラグイン:FileWriter(Open MagicVox.net)
- FileWriter を使ってタグ検索の結果をキャッシュする(Open MagicVox.net)