Movable Typeの個別のブログ記事にその記事の投稿月の前後の月別アーカイブへのリンクを表示するカスタマイズ

先日、Twitter での @mersyさんの次のようなつぶやきをみて、自分なりにゴニョゴニョ考えてやってみました。 個別エントリーでそのエントリーの投稿月の前後の月へのリンク。ふむ。簡単にはいかないんだっけかな。 MTタグには、MTArchiveNext タグや MTArchivePrevious というのもあり、そのアーカイブテンプレートの前後のアーカイブテンプレートの内容を出力するものはあり...

先日、Twitter での @mersyさんの次のようなつぶやきをみて、自分なりにゴニョゴニョ考えてやってみました。

個別エントリーでそのエントリーの投稿月の前後の月へのリンク。ふむ。簡単にはいかないんだっけかな。

MTタグには、MTArchiveNext タグや MTArchivePrevious というのもあり、そのアーカイブテンプレートの前後のアーカイブテンプレートの内容を出力するものはあります。

しかし、これらのテンプレートタグは、今回のように「ブログ記事」の中で「月別ブログ記事リスト」といった別のコンテキストの内容を表示させることはできません。

そこで、今回は、配列を使ってやってみることにしました。

完成したテンプレート

完成したテンプレートは次のようになります。

<$mt:SetVar name="count" value="0"$>
<$mt:EntryDate format="%Y&#24180;%b&#26376;" setvar="crt_month"$>

<mt:ArchiveList archive_type="Monthly">
 <$mt:ArchiveTitle setvar="archive_title"$>

 <mt:SetVarBlock name="archive_link" index="$count">
 <a href="<$mt:ArchiveLink$>"><$mt:ArchiveTitle$></a>
 </mt:SetVarBlock>

 <mt:If name="archive_title" eq="$crt_month">
 <$mt:Var name="count" setvar="crt_index"$>
 </mt:If>

 <$mt:SetVar name="count" op="inc"$>
</mt:ArchiveList>

<mt:SetVarBlock name="prev_index"><$mt:Var name="crt_index" op="+" value="1"$></mt:SetVarBlock>
<mt:SetVarBlock name="next_index"><$mt:Var name="crt_index" op="-" value="1"$></mt:SetVarBlock>
<mt:SetVarBlock name="arry_count"><$mt:Var name="archive_link" function="count"$></mt:SetVarBlock>

<ul>
<mt:Unless name="prev_index" eq="$arry_count">
 <li>前月の記事一覧:<$mt:Var name="archive_link" index="$prev_index"$></li>
</mt:Unless>
 <li>当月の記事一覧:<$mt:Var name="archive_link" index="$crt_index"$></li>
<mt:Unless name="next_index" eq="-1">
 <li>翌月の記事一覧:<$mt:Var name="archive_link" index="$next_index"$></li>
</mt:Unless>
</ul>

解説

上から順に解説してみます。

<$mt:SetVar name="count" value="0"$>
<$mt:EntryDate format="%Y&#24180;%b&#26376;" setvar="crt_month"$>

まず、最初に count と crt_month という二つの変数をセットしておきます。ちなみに、crt は current の略で、僕のソースに良く出てきます。

2行目の format モディファイアの「%Y&#24180;%b&#26376;」というのは、「%Y年%b月」の「年」と「月」をエンコード(?)したものです。

Movable Type の場合、日付に関するモディファイアで出力される日本語はこのようにエンコードされて出力されるようなので、「xxxx年x月」などを正規表現でマッチさせようとしてもうまくいかない場合は、この部分を疑うといいかもしれません。

<mt:ArchiveList archive_type="Monthly">
 <$mt:ArchiveTitle setvar="archive_title"$>

 <mt:SetVarBlock name="archive_link" index="$count">
 <a href="<$mt:ArchiveLink$>"><$mt:ArchiveTitle$></a>
 </mt:SetVarBlock>

 <mt:If name="archive_title" eq="$crt_month">
 <$mt:Var name="count" setvar="crt_index"$>
 </mt:If>

 <$mt:SetVar name="count" op="inc"$>
</mt:ArchiveList>

MTArchiveList タグでブログ記事リストに関する項目をリストアップさせます。archive_type モディファイアに Monthly を指定して「月別ブログ記事リスト」に関する情報をリストアップさせます。

<$mt:ArchiveTitle setvar="archive_title"$> で「xxxx年x月」というアーカイブタイトルを変数 archive_title にセットします。

 <mt:SetVarBlock name="archive_link" index="$count">
 <a href="<$mt:ArchiveLink$>"><$mt:ArchiveTitle$></a>
 </mt:SetVarBlock>

ここで、配列 archive_link の中に、先ほどセットした変数 count を配列のインデックス値として「月別ブログ記事リストへのリンク」を格納していきます。

変数 count は、このテンプレートのブロックの最後で

<$mt:SetVar name="count" op="inc"$>

として1ずつ加算していきます。MTArchiveList タグの中ではデフォルト変数の __count__ が使えなかったのでこのようにしています。

 <mt:If name="archive_title" eq="$crt_month">
 <$mt:Var name="count" setvar="crt_index"$>
 </mt:If>

次の MTIf タグで、最初にセットした現在のブログ記事の年月を表す変数 crt_month が、MTArchiveList でループされている年月と一致するか調べます。一致した場合は、そのループ中の変数 count の値を変数 crt_index にセットします。これにより、そのブログ記事の「xxxx年x月」が、配列 archive_link の中のどのインデックス値に格納されているのかが分かります。

<mt:SetVarBlock name="prev_index"><$mt:Var name="crt_index" op="+" value="1"$></mt:SetVarBlock>
<mt:SetVarBlock name="next_index"><$mt:Var name="crt_index" op="-" value="1"$></mt:SetVarBlock>
<mt:SetVarBlock name="arry_count"><$mt:Var name="archive_link" function="count"$></mt:SetVarBlock>

次の 3行で、そのブログ記事の「xxxx年x月」が格納されているインデックス値の前後のインデックス値(つまり前後の「xxxx年x月」)と、配列 archive_link に格納されている値の数を、それぞれ変数にセットします。

ここで注意しておきたいのは、変数 count でセットされるインデックス値はゼロから始まり 1 ずつ増えていくのに対して、MTArchiveList は最新の年月から過去の年月に遡って出力される(つまり数字的には減っていく)ので、インデックス値と配列の値が逆方向に増えていくところです。説明しにくいのですが、インデックス値が「↑」で値が「↓」というイメージです。

それにより、前月のインデックス値が「 op="+" 」で、翌月のインデックス値が「 op="-" 」となっているのです。

<ul>
<mt:Unless name="prev_index" eq="$arry_count">
 <li>前月の記事一覧:<$mt:Var name="archive_link" index="$prev_index"$></li>
</mt:Unless>
 <li>当月の記事一覧:<$mt:Var name="archive_link" index="$crt_index"$></li>
<mt:Unless name="next_index" eq="-1">
 <li>翌月の記事一覧:<$mt:Var name="archive_link" index="$next_index"$></li>
</mt:Unless>
</ul>

そして最後に、ここまでにインデックス値をセットした変数により、「xxxx年x月」という「月別ブログ記事リスト」へのリンクを表示させます。

このとき、もし現在のブログ記事の「xxxx年x月」が格納されているインデックス値が「0」だった場合(つまり最新の年月だった場合)、その翌月のインデックス値は「-1」となるので、その場合は翌月の記事一覧の表示はさせないようにします。

また、前月の「xxxx年x月」が格納されているインデックス値が、配列に格納されている値の数と同じ場合は、現在のブログ記事は最古の年月ということになるので、その場合は全別のブログ記事リストは表示させないようにします。

以上です。

@apstarさんも同様のつぶやきに反応し、『MT4.2:現エントリの一つ前と一つ後の月別アーカイブの表示』という記事を書かれています。こちらは「 MTSetVarTemplate 」を使った方法が紹介されていて、僕もとても参考になりました。

また、@mersy さんも『MovableTypeの個別エントリーでそのエントリーの投稿月の前後の月へのリンクを表示する方法』という記事を書かれています。

これらも併せてご参照ください。

Published 2009-09-18
Updated 2019-06-25