印刷用表示へ切り替え 通常表示へ切り替え 更新履歴を表示 更新履歴を隠す
MovableType 月別アーカイブへのリンクをもっと nDialy 風に

メインインデックスの月別アーカイブへのリンク表示を「もっと」 nDialy 風にする。

■ ■ ■

ブログを続けていると,メインインデックス(トップページ)に表示している月別アーカイブへのリンクが長くなってくる。先日のカスタマイズでは,リンクを nDialy 風にした(nlog(n): 月別アーカイブへのリンクを nDialy 風に)。投稿のある月だけを表示する場合は,その方法でOK。ここでは,投稿があってもなくても月名を表示し,投稿がある月へはリンクを張るようにする。nDiary では,日記もどき さん風の表示になる。

環境は Movable Type 2.661+日本語化パッチで,使用プラグインは ArchiveYear pluginArchive Date Header PluginPerlScript PluginMTTagInvoke である(多いな)。ArchiveYear プラグイン配布元の Lummox JR 氏のサイトが消えていて入手できないというピンチは,Junkline - MT の過去ログリンク表示を nDiary (ごにょり済み)風に さんのページで回避される。

さて,投稿がない場合でも月名を表示するには,MTArchiveYear プラグインを利用する。一番基本となるコードは次の通り。

<MTArchiveYear>
  <MTArchiveYearIfEntries>
    <a href="<$MTBlogArchiveURL$><$MTArchiveDate format="%Y_%m.html"$>"><$MTArchiveDate format="%b"$></a>
  </MTArchiveYearIfEntries>
  <MTArchiveYearIfNoEntries>
      <$MTArchiveDate format="%b"$>
  </MTArchiveYearIfNoEntries>
</MTArchiveYear>

再構築すると,次のようになる。

Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec

現在は6月で,今年は毎月投稿しているので1月から6月まではリンクがあり,7月以降は記事がないのでリンクが生成されていない。月の名前は,Jan, Feb ではなく 01, 02 のようにもできる。日付タグのフォーマットに関してはマニュアルを参照(Movable Typeユーザー・マニュアル: テンプレート・ タグ)。

MTArchiveYear プラグインは,年別のアーカイブを作成する目的で作られているため,現在の1年間分の月しか表示しない。上の再構築結果は2006年分のみということになる。MTArchiveYear タグには year 属性が設定でき,<MTArchiveYear year="2005"> とすれば,2005年分の月が全て表示されるようにできる。そこで,MTArchiveDateHeader プラグインを使って,年を求める。

<MTArchiveList archive_type="Monthly">
  <MTArchiveDateHeader>
    <$MTArchiveDate format="%Y"$>
  </MTArchiveDateHeader>
</MTArchiveList>

再構築すると,次が得られる。

2006 2005 2004

これを使って <MTArchiveYear year="<$MTArchiveDate format="%Y"$>"> のようにしたいのだが,タグの中にタグは書くことができない。そこで,MTTagInvoke プラグインを使って,擬似的に「タグ中タグ」を実装する(nlog(n): MTTagInvoke を MTBlogTimes に使う)。少し複雑になるが,がんばってコーディングすると次のようになる。

<MTArchiveList archive_type="Monthly">
  <MTArchiveDateHeader>
    <$MTArchiveDate format="%Y"$>:
    <MTTagInvoke tag_name="MTArchiveYear">
      <MTTagAttribute name="year">
        <$MTArchiveDate format="%Y"$>
      </MTTagAttribute>
      <MTTagContent>
        <MTArchiveYearIfEntries>
          <a href="<$MTBlogArchiveURL$><$MTArchiveDate format="%Y_%m.html"$>"><$MTArchiveDate format="%B"$></a>
        </MTArchiveYearIfEntries>
        <MTArchiveYearIfNoEntries>
          <$MTArchiveDate format="%B"$>
        </MTArchiveYearIfNoEntries>
        <MTPerlScript>
          $m = '<$MTArchiveDate format="%m"$>';
          if ($m eq "12") {
            print "<br />";
          }
        </MTPerlScript>
      </MTTagContent>
    </MTTagInvoke>
  </MTArchiveDateHeader>
</MTArchiveList>

投稿があってもなくても年の最後は12月になるので,改行は12月終了時点で入れるようにしている。先の方法(nlog(n): 月別アーカイブへのリンクを nDialy 風に)とは異なっているので注意。再構築すると,次のようになる。

2006: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2005: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2004: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec

このサイトで実際に使っているコードは次の通り(くわわっ)。かなりパズル的でゲンナリするが,人間辛抱が肝心だ。

<MTArchiveList archive_type="Monthly">
  <MTArchiveDateHeader>
    <a href="<$MTBlogArchiveURL$><$MTArchiveDate format="%Y.html"$>" title="<$MTArchiveDate format="%Y年"$>"><$MTArchiveDate format="%Y"$></a>:
    (<$MTArchiveYearCount$>)<br />
    <MTTagInvoke tag_name="MTArchiveYear">
      <MTTagAttribute name="year">
        <$MTArchiveDate format="%Y"$>
      </MTTagAttribute>
      <MTTagContent>
        <MTArchiveYearIfEntries>
          <MTPerlScript>
            $m = <$MTArchiveDate format="%b"$>;
            $m = substr($m, 0, 1);
            print '<a href="<$MTBlogArchiveURL$><$MTArchiveDate format="%Y_%m.html"$>" title="<$MTArchiveDate format="%b %Y" language="jp"$>">' . lc($m) . '</a>.';
          </MTPerlScript>
        </MTArchiveYearIfEntries>
        <MTArchiveYearIfNoEntries>
          <MTPerlScript>
            $m = <$MTArchiveDate format="%b"$>;
            $m = substr($m, 0, 1);
            print lc($m) . '.';
          </MTPerlScript>
        </MTArchiveYearIfNoEntries>
        <MTPerlScript>
          $m = '<$MTArchiveDate format="%m"$>';
          if ($m eq "12") {
            print "<br />";
          }
        </MTPerlScript>
      </MTTagContent>
    </MTTagInvoke>
  </MTArchiveDateHeader>
</MTArchiveList>

再構築すると次のようになる。

2006: (102)
j.f.m.a.m.j.j.a.s.o.n.d.
2005: (239)
j.f.m.a.m.j.j.a.s.o.n.d.
2004: (366)
j.f.m.a.m.j.j.a.s.o.n.d.

月名を英字1文字にしている。こんなマニアックな表示をしたい人はいないだろうが,参考まで。The Neurotic Fishbowl That Is My Life... 風になる(実装コードは不明)。

年のリストを作成する方法としては,SomeDays プラグインを使う方法もある。

<MTSomeDays group="year" reverse="1" yearly="1" select="until">
  <$MTSDWorkDate format="%Y"$>
</MTSomeDays>

再構築すると次のように投稿年の一覧が得られる。

2006 2005 2004

逆順にすることも簡単である(reverse="1" を削除すればよい)。ただし,日付の設定が独自なため,MTSomeDays の中では MTArchiveDate タグや MTArchiveYearCount タグが使えないという欠点がある。

MTTagInvoke で擬似的にタグの入れ子を実装する関連記事:

2007年7月3日追記:
各月の投稿数を正しく表示したい場合は,ArchiveLoad プラグインを使い,<$MTArchiveCount$> を包んでやる必要があります (MT の過去ログリンク表示を nDiary (ごにょり済み)風に < Junkline)。

<MTArchiveList archive_type="Monthly">
  <MTArchiveDateHeader>
    <span class="calendarhead"><a href="<$MTBlogArchiveURL$><$MTArchiveDate format="%Y.html"$>" title="<$MTArchiveDate format="%Y年" language="jp"$> (<$MTArchiveYearCount$>)"><$MTArchiveDate format="%Y"$></a></span>:
    <MTTagInvoke tag_name="MTArchiveYear">
    <MTTagAttribute name="year"><$MTArchiveDate format="%Y"$></MTTagAttribute>
    <MTTagContent>
      <MTArchiveYearIfEntries>
        <MTArchiveLoad>
          <MTPerlScript>
            $m = <$MTArchiveDate format="%b"$>; $m = substr($m, 0, 1);
            print '<a href="<$MTBlogArchiveURL$><$MTArchiveDate format="%Y_%m.html"$>" title="<$MTArchiveDate format="%B %Y" language="jp"$> (<$MTArchiveCount$>)">' . lc($m) . '</a>.';
          </MTPerlScript>]
        </MTArchiveLoad>
      </MTArchiveYearIfEntries>
      <MTArchiveYearIfNoEntries>
        <MTPerlScript>
          $m = <$MTArchiveDate format="%b"$>; $m = substr($m, 0, 1); print lc($m) . '.';
        </MTPerlScript>
      </MTArchiveYearIfNoEntries>
      <MTPerlScript>
        $m = '<$MTArchiveDate format="%m"$>';
        if ($m eq "12") { print "<br />"; }
      </MTPerlScript>
    </MTTagContent>
    </MTTagInvoke>
  </MTArchiveDateHeader>
</MTArchiveList>
Posted by n at 2006-06-26 23:54 | Edit | Comments (2) | Trackback(0)
Trackbacks

  • 「手違いで複数トラックバックを送ってしまった!」という場合でも気にしないでください (重複分はこちらで勝手に削除させていただきます)
  • タイムアウトエラーは,こちらのサーバの処理能力不足が原因です (詳細は トラックバック送信時のエラー をご覧ください)
  • トラックバックする記事には,この記事へのリンクを含めてください(詳細は 迷惑トラックバック対策 をご覧ください)
Comments

アクセスログをたどって来ました。「日記もどき」のTmasです。nDiary 使いのなかでも極めてマイナーな私のサイトが例にあげられていてびっくりしました。単に標準のプラグインを使っているだけなのですが……

Posted by: Tmas at June 29, 2006 21:48

これはこれは。「日記もどき」は長年続けていらっしゃる日記が見やすく並んでいて素敵です。

Posted by: n at June 29, 2006 22:28
Post a comment
  • 電子メールアドレスは必須ですが,表示されません (気になる場合は「メールアドレスのような」文字列でもOKです)
  • URL を入力した場合はリンクが張られます
  • コメント欄内ではタグは使えません
  • コメント欄内に URL を記入した場合は自動的にリンクに変換されます
  • コメント欄内の改行はそのまま改行となります
  • 「Confirmation Code」に表示されている数字を入力してください (迷惑コメント対策です)


(必須, 表示されます)


(必須, 表示されません)


(任意, リンクされます)


Confirmation Code (必須)


Remember info (R)?