記事本文
Movable Type の年別アーカイブの解説をしてみよう
昨日はヴァルシュタイナーを飲んだ後に釈云麦をロックでいただいていたので、日付が変わる頃にはすっかり良い気分になりました。 そんな折に IRC チャンネル #hxxk にて drry さん ( drry+@->Weblog ) に年別アーカイブに関する質問を受け、後日回答しますと言っていたのでちょっと解説してみます。 なお、環境は Movable Type 3.2-ja-2 を想定していますので、それ以外の言語のものや古いバージョンのものをお使いの場合は適宜解説を読み替えてください。
Movable Type ではデフォルトでは年別アーカイブは作られない
先日 Movable Type 3.2 の Archive File Path 形式のフォーマットと実際の出力フォーマットの早見表にて、デフォルトでの URI 設計について触れました。 エントリアーカイブの場合は yyyy/mm/entry_basename.html 、日別アーカイブの場合は yyyy/mm/dd/index.html 、月別アーカイブの場合は yyyy/mm/index.html のようになっています。 しかし、 yyyy/index.html のようなフォーマットで生成される年別アーカイブはありません。
そのために、 yyyy/ のディレクトリにアクセスしても、 403 Forbidden となってしまうか、あるいはディレクトリ内のリソースが全て丸見えになってしまうといったことになってしまいます。 ( サーバ側の設定によりますし、人によってはわざとディレクトリを丸見えにすることで年別アーカイブ代わりにしているケースもあるでしょうが、あまりスマートではありません。 )
年別アーカイブを作る - プラグインの導入
実際のテンプレートソースを紹介する前に、プラグインの導入をお願いします。 デフォルトでは年別アーカイブが作られないということは、標準のテンプレートタグでは実現できないことと近似ですゆえ。
必要なプラグインは ArchiveYear Plugin と ArchiveLoad Plugin の 2 つなのですが、現在は作者のサイト自体が 404 Not Found のようです。 Junkline - MT の過去ログリンク表示を nDiary (ごにょり済み)風にという記事にプラグインのミラーが置かれていますので、そこから入手して plugins フォルダに put してください。
なお、Junkline - MT の過去ログリンク表示を nDiary (ごにょり済み)風にや、そこから辿ることができる Chitatopops: 年別アーカイブにてテンプレートソースの実例が書かれているため、これら 2 つの記事を見ていただくだけでも年別アーカイブは実現できますが、せっかくなので次項以降では hxxk.jp でのソースを紹介していこうと思います。
年別アーカイブを作る - テンプレートの作成
年別アーカイブを作る場合、まずはテンプレートから作成します。 Movable Type の管理画面から「テンプレート」→「アーカイブ」→「テンプレートを新規作成」とクリックしていき、次のソースを参考にしてテンプレートを作成します。 テンプレートの名前は任意で構いませんが、年別アーカイブであるということが分かりやすい名前にしてください。
<?xml version="1.0" encoding="<$MTPublishCharset$>"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="<$MTDefaultLanguage$>" xml:lang="<$MTDefaultLanguage$>">
<head profile="http://purl.org/net/ns/metaprof">
<meta http-equiv="Content-Type" content="text/html; charset=<$MTPublishCharset$>">
<meta name="generator" content="Movable Type <$MTVersion$>" />
<meta name="description" content="<$MTBlogName encode_html="1" remove_html="1"$> の <$MTArchiveDate format="%Y"$> 年の記事タイトル一覧" />
<title><$MTBlogName encode_html="1" remove_html="1"$> - <$MTArchiveDate format="%Y"$> 年アーカイブ</title>
<link rel="stylesheet" href="<$MTBlogURL$>styles-site.css" type="text/css" />
<MTArchiveYearPrevious><link rel="prev" href="<$MTBlogArchiveURL$><$MTArchiveDate format="%Y/"$>" title="<$MTBlogName encode_html="1" remove_html="1"$> - <$MTArchiveDate format="%Y"$> 年アーカイブ" /></MTArchiveYearPrevious>
<MTArchiveYearNext><link rel="next" href="<$MTBlogArchiveURL$><$MTArchiveDate format="%Y/"$>" title="<$MTBlogName encode_html="1" remove_html="1"$> - <$MTArchiveDate format="%Y"$> 年アーカイブ" /></MTArchiveYearNext>
</head>
<body>
<h1><a href="<$MTBlogURL$>"><$MTBlogName encode_html="1" remove_html="1"$></a></h1>
<h2><$MTArchiveDate format="%Y"$> 年アーカイブ</h2>
<ol>
<MTArchiveYear order="descend">
<MTArchiveYearIfEntries>
<MTArchiveLoad>
<MTDateHeader>
<li><a href="<$MTBlogArchiveURL$><$MTArchiveDate format="%Y/%m/"$>" title="<$MTBlogName encode_html="1" remove_html="1"$> - <$MTArchiveDate format="%Y 年 %m"$> 月アーカイブ"><$MTArchiveDate format="%Y 年 %m"$> 月アーカイブ</a>
<ol>
<MTEntries sort_order="descend">
<li><$MTArchiveDate format="%Y/%m/%d" %H:%M"$> - <a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li>
</MTEntries>
</ol>
</li>
</MTDateHeader>
</MTArchiveLoad>
</MTArchiveYearIfEntries>
</MTArchiveYear>
</ol>
</body>
</html>
少し変更を加えていますが、 hxxk.jp - 2005 の内容と同じような形式のテンプレートです。 その年の月別アーカイブおよび記事の一覧にリンクするようなアーカイブです。
年別アーカイブを作る - テンプレートの関連付け
次に、テンプレートの関連付けを行います。 Movable Type の管理画面から「設定」→「公開」→「マッピングを新規作成」とクリックしていき、「アーカイブの種類」は月別を選択し、「テンプレート」は先ほど作成した年別アーカイブテンプレートを選択します。
関連付けをした後に、出力フォーマットをカスタマイズします。
先ほど関連付けをしたテンプレートの横のプルダウンメニューをクリックし、「カスタマイズする」を選び、
%y/%i
と記述してください。
( Movable Type 3.2 以前のバージョンをお使いの場合、あるいは Archive File Path 形式を好まない場合は
<$MTArchiveDate format="%Y"$>/<$MTIndexBasename$><$MTBlogFileExtension$>
と記述してください。 )
出力フォーマットまで設定したら、あとは月別アーカイブを再構築して完了です。 以後、月別アーカイブを再構築する時、または記事を投稿および更新する時に年別アーカイブも更新されることになります。
応用編 - 全記事一覧を年ごとに分ける
ついでに、年別アーカイブのソースを利用して、全記事一覧を年ごとに分ける方法を紹介します。 hxxk.jp - 記事目次がそのまま実例になりますが、今度はインデックステンプレートの方に手を加えることになります。 ( 新たに作成しても構いませんし、「アーカイブページ」のテンプレート ( Master Archive Index ) に適用しても構いません。 )
<?xml version="1.0" encoding="<$MTPublishCharset$>"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="<$MTDefaultLanguage$>" xml:lang="<$MTDefaultLanguage$>">
<head profile="http://purl.org/net/ns/metaprof">
<meta http-equiv="Content-Type" content="text/html; charset=<$MTPublishCharset$>">
<meta name="generator" content="Movable Type <$MTVersion$>" />
<meta name="description" content="<$MTBlogName encode_html="1" remove_html="1"$> の全記事アーカイブ" />
<title><$MTBlogName encode_html="1" remove_html="1"$> - 全記事アーカイブ</title>
<link rel="stylesheet" href="<$MTBlogURL$>styles-site.css" type="text/css" />
</head>
<body>
<h1><a href="<$MTBlogURL$>"><$MTBlogName encode_html="1" remove_html="1"$></a></h1>
<h2>全記事アーカイブ</h2>
<ol>
<MTArchiveList archive_type="Monthly">
<MTArchiveDateHeader>
<li><a href="<$MTBlogArchiveURL$><$MTArchiveDate format="%Y/"$>" title="<$MTBlogName encode_html="1" remove_html="1"$> - <$MTArchiveDate format="%Y"$> 年アーカイブ"><$MTArchiveDate format="%Y"$> 年アーカイブ</a>
<ol>
<MTArchiveYear order="descend">
<MTArchiveYearIfEntries>
<MTArchiveLoad>
<MTDateHeader>
<li><a href="<$MTBlogArchiveURL$><$MTArchiveDate format="%Y/%m/"$>" title="<$MTBlogName encode_html="1" remove_html="1"$> - <$MTArchiveDate format="%Y 年 %m"$>月アーカイブ"><$MTArchiveDate format="%Y 年 %m"$>月アーカイブ</a>
<ol>
<MTEntries sort_order="descend">
<li><$MTArchiveDate format="%Y/%m/%d %H:%M"$> - <a href="<$MTEntryPermalink$>"><$MTEntryTitle$></a></li>
</MTEntries>
</ol>
</li>
</MTDateHeader>
</MTArchiveLoad>
</MTArchiveYearIfEntries>
</MTArchiveYear>
</ol>
</li>
</MTArchiveDateHeader>
</MTArchiveList>
</ol>
</body>
</html>
こちらはインデックステンプレートになるため、記事を投稿および更新する時に更新されることになります。

