ブログ記事の公開日ごとに連番を振る

昨日、当ブログの読者の方から、Movable Typeに関するご質問をいただきました。
それを元に、「ブログ記事の公開日ごとに連番を振る」というカスタマイズを紹介します。
なお、このカスタマイズはMovable Type 4.1以降で利用できます。

1.ご質問の概要

いただいたご質問の概要は、以下のようなものです。

ブログ記事を一覧表示する際に、個々の記事の日付の箇所に、その公開日の中での連番を振りたいです。
ただし、その日に記事が1つしかない場合は、連番を振らないようにします。

例えば、以下のように記事を書いたとします。

日付記事数
2008年1月1日1
2008年1月2日3
2008年1月3日1
2008年1月4日2

この場合、各記事の日付の部分を以下のようにしたいです。

  • 2008年1月1日
  • 2008年1月2日-1
  • 2008年1月2日-2
  • 2008年1月2日-3
  • 2008年1月3日
  • 2008年1月4日-1
  • 2008年1月4日-2

上記のようなことを正確に処理するには、同一公開日の記事の中での連番を求めるようなプラグインを作ることが必要です。
ただ、メインページに限定するなら、テンプレートタグだけでも何とかなります。

2.公開日ごとの記事数を数える

いただいたご質問では、同じ公開日の記事が2つ以上あるかどうかで、連番を振るかどうかを分けています。
そのような処理をするためには、同じ公開日の記事の数を調べることが必要です。
Movable Typeのタグにはそのようなものはありませんが、テンプレートタグを組み合わせて処理することができます。

MTEntriesタグを使うと、記事を順に取り出してその情報を扱うことができます。
このタグのブロックの中で、記事の公開日をキーとし、記事数を値とするハッシュを作るように、テンプレートタグを組みます。
例にあげたような場合だと、以下のようなハッシュを作るようにします。

キー
200801011
200801023
200801031
200801042

具体的には、以下のような流れで処理をします。

  • 記事の公開日から、キーの値を求めます。
  • 同じ公開日の中での最初の記事なら、そのキーに対応する値を1に初期化します。
  • 同じ公開日の中での2つ目以降の記事なら、キーに対応する値を1増やします。

同じ公開日の中での最初の記事かどうかは、MTDateHeaderタグで判断することができます。
また、キーに対応する値をセットするのは、MTSetVarタグで行うことができます。
上記の処理を実際にタグで表すと、以下のようになります。
記事一覧を出力する部分(通常のMTEntriesタグのブロック)の前に、このタグを入れます。

<MTEntries>
  <MTSetVarBlock name="day_key"><$MTEntryDate format="%Y%m%d"></MTSetVarBlock>
  <MTDateHeader>
    <MTSetVar name="day_count" key="$day_key" value="1">
  <MTElse>
    <MTSetVar name="day_count" key="$day_key" op="++">
  </MTDateHeader>
</MTEntries>

3.連番を出力する

次に、記事一覧を出力する部分に手を加えて、連番を出力するようにします。

まず、同じ公開日の中で最初の記事のときには、連番を1に初期化し、また日付に対応するキーを作ります。
同じ公開日の中で最初の記事かどうかは、前述したMTDateHeaderタグで行うことができます。
連番を「ctr」という変数で管理するとすれば、この処理は以下のように書くことができます。

<MTDateHeader>
  <MTSetVarBlock name="day_key"><$MTEntryDate format="%Y%m%d"></MTSetVarBlock>
  <MTSetVar name="ctr" value="1">
</MTDateHeader>

また、日付を出力する部分では、以下のような処理をします。

  • その記事と同じ公開日の記事が2個以上あるかどうかを判断する
  • 2個以上あれば、ハイフンと連番(変数ctrの値)を出力し、次の記事の連番を出力するために、連番の値を1つ増やす

公開日ごとの記事の数は、「2.公開日ごとの記事数を数える」のところで作ったハッシュに保存されています。
そこで、そのハッシュから日付のキーに対応する値を得て、それが2以上かどうかを判断し、処理を分けます。

テンプレートタグで書くと、以下のようになります。

<MTIf name="day_count" key="$day_key" ge="2">
-<MTGetVar name="ctr">
<MTSetVar name="ctr" op="++">
</MTIf>

4.連番を逆順にする

Movable Typeの標準の設定では、記事は新しいものから順に出力されます。
上の手順で記事に連番を振ると、新しい記事から連番がつきます。
しかし、同じ日の記事の中では、古いものから連番を振りたいということも考えられます。

その場合、同じ日の最初の記事で、連番の初期値をその日の記事の数に初期化します。
そして、記事を1つ出力するごとに、連番を1つずつ減らすようにします。

初期化の部分は以下のように変えます。

<MTDateHeader>
  <MTSetVarBlock name="day_key"><$MTEntryDate format="%Y%m%d"></MTSetVarBlock>
  <MTSetVarBlock name="ctr"><MTGetVar name="day_count" key="$day_key"></MTSetVarBlock>
</MTDateHeader>

また、連番を出力する部分は以下のように変えます。

<MTIf name="day_count" key="$day_key" ge="2">
-<MTGetVar name="ctr">
<MTSetVar name="ctr" op="--">
</MTIf>