今月のアーカイブページにリンクする

mixiのMovable Typeのコミュニティで、「今月のアーカイブページにリンクするにはどうすれば良いか」という質問を見かけました。
この質問に答えてみます。

1.考え方

Movable Typeの標準の設定では、月別アーカイブページのアドレスは、「http://ブログのアドレス/年/月/」となります(年は4桁、月は2桁で「01」~「12」)。
例えば、ブログのアドレスが「http://www.hoge.com」の場合、2009年2月のアーカイブページのアドレスは、「http://www.hoge.com/2009/02/」になります。

したがって、ブログのアドレスと、現在の年/月が分かれば、今月のアーカイブへのリンクを出力することができます。
ブログのアドレスはMTBlogURLタグで得ることができます。
一方、現在の年と月を得る方法は、いくつか考えられます。

2.MTDateタグを使う

Movable Type標準のテンプレートタグに、「MTDate」があります。
このテンプレートタグは、再構築した時点の日時を表します。

そこで、MTDateタグとformatモディファイアを組み合わせて、再構築した時点の日時の年と月を取り出し、リンクを出力するようにします。
具体的には、以下のようにタグを書きます。

<a href="<$mt:BlogURL$><$mt:Date format="%Y/%m">/">今月のアーカイブ</a>

3.PHPを使う

MTDateタグは、前述したように、再構築した時点の日時を表します。
再構築しないとMTDateタグの部分は更新されません。
そのため、2.の方法だと、月が変わってから最初に再構築するまでは、今月ではなく、前月のアーカイブページにリンクする状態になってしまいます。

そこで、PHPを使う方法も考えられます。
これなら、サーバーにアクセスされた時点の日付を元にリンクを出力することができますので、リアルタイムに今月のアーカイブページへのリンクを出力することができます。
ただし、サーバーの時計が正確に合っていることが必要です。

まず、今月のアーカイブページへのリンクを含むページを、PHPのファイルとして出力するようにします。
その上で、リンクを出力する部分を、以下のように書きます。

<a href="<$mt:BlogURL$><?php print(date('Y/m')); ?>/">今月のアーカイブ</a>

4.JavaScriptを使う

サーバーの事情等で、PHPが使えないこともあります。
この場合は、JavaScriptでリンクを出力する、という方法も考えられます。
各ユーザーのパソコンの日付を元にリンクを出力しますので、リアルタイムに今月のアーカイブページへのリンクを出力することができます。
ただし、各ユーザーのパソコンの時計が合っていることが前提です。

この方法では、リンクを出力したい位置に、以下のようなJavaScriptを入れます。

<script type="text/javascript">
(function(){
    var d = new Date();
    var y = d.getYear() + 1900;
    var m = '0' + (d.getMonth() + 1);
    m = m.substr(m.length - 2);
    document.write('<a href="<$mt:BlogURL encode_js="1">' + y + '/' + m + '/">今月のアーカイブ</a>');
})();
</script>

なお、ユーザーがJavaScriptをオフにしていると、この方法ではリンクが出力されません。
そこで、noscriptタグを組み合わせて、JavaScriptがオフになっているときには2.の方法でリンクを出力する、といったようにすることも必要でしょう。