top

月別アーカイブを年毎に区切ってみる(3) 4.0完成版

月別アーカイブが増えてくると縦にずらーっと長く並んで場所をとるので、もっとコンパクトに整理したいと思うことはありませんか。従来それによく使われてきたのがArchiveDateHeaderプラグインです。これを使うと以下のように書いて

<MTArchiveList archive_type="Monthly">
<MTArchiveDateHeader>
<br /><MTArchiveDate format="%Y">年:
</MTArchiveDateHeader>
<a href="<$MTArchiveLink$>"><MTArchiveDate format="%B">月</a>
</MTArchiveList>

以下のようにコンパクト化できます。

2007年:6月 5月 4月 3月 2月 1月
2006年:12月 11月 10月 9月 8月 7月 6月 5月 4月 3月 2月 1月

<li></li>が使えるように ArchiveDateFooterプラグインと組みわせてマークアップすることもできます。

この方法の問題点
ただしこの方法には限界がありました。月アーカイブを年ごとに区切っているだけなので、月部分が1月から始まらずに12月(投稿のある最新月)から始まってしまうのです。かといって<MTArchiveList archive_type="Monthly" sort_order="ascend">のようにsort_order="ascend"をつけて昇順にすると全体も昇順になってしまって、以下のように年の並びまで昇順になってしまうのです。

2006年:1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2007年:1月 2月 3月 4月 5月 6月

正直これではあまり見やすいとは言えません…。ここはやっぱり年は降順、月は昇順になってくれるのが感覚的に分かりやすく見やすい。それを解決してくれていたのがArchiveYearプラグインとArchiveLoadプラグインでした。ArchiveDateHeaderプラグインとこの2つを組み合わせることで、以下のように年は降順、月は昇順に出来ていたのです。

2007年:1月 2月 3月 4月 5月 6月
2006年:1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月

MT4の問題点
ところがMT4でArchiveYearプラグインとArchiveLoadプラグインが上手く動作しなくなりました。それでしかたなく暫定的にCompareプラグインを使って年を降順、月を昇順にしていたのですが、せっかくMT4になったのだから新しいタグを使ってMTタグだけでこのようなことが出来ないものかと考えていました。試行錯誤の結果、ついにMTタグだけで年を降順・月を昇順にすることが出来たのでここに覚え書きです。

追記:
4.0では年アーカイブに月アーカイブを入れ子にした場合、全ての月リストが出力されていたので、変数を使って「その年に属する月」を求める必要がありました。が、4.1からは年アーカイブに月アーカイブを入れ子にした場合「その年に属する月」のみ出力されるように改善されたので、より簡単に目的のことが出来るようになりました。そのため4.0用、4.1以降用に分けて解説を行うように修正しました。(2008.9.18)

■本題1:MT4で年を降順・月を昇順にして月アーカイブをコンパクト化する(4.0用)
これにはMT4から加わった年アーカイブを使います。アトリビュートに変数が使えるようになったのに目を付けて、年アーカイブから<MTSetVarBlock>で変数(年)を取得し、<MTIf>のアトリビュートeq="xxxx"を使ってその年に所属する月のみを表示させるようにしました。以下、タグの書き方。

<MTArchiveList archive_type="Yearly">
<MTSetVarBlock name="year"><$MTArchiveDate format="%Y" language="en"$></MTSetVarBlock>
<$MTArchiveDate format="%Y" language="en"$>年:
<MTArchiveList archive_type="Monthly" sort_order="ascend">
<MTSetVarBlock name="year2"><$MTArchiveDate format="%Y" language="en"$></MTSetVarBlock>
<MTIf name="year2" eq="$year">
<a href="<$MTArchiveLink$>"><$MTArchiveDate format="%B"$>月</a> 
</MTIf>
</MTArchiveList><br />
</MTArchiveList>

さらに<MTArchiveListHeader>と<MTArchiveListFooter>を加えれば<li>や<dt><dd>なども使えるようになるのでより細かい調整やマークアップが出来るようになると思います。以下は定義リスト化してみた場合。

<dl>
<MTArchiveList archive_type="Yearly">
<MTSetVarBlock name="year"><$MTArchiveDate format="%Y" language="en"$></MTSetVarBlock>
<dt><$MTArchiveDate format="%Y" language="en"$>年:</dt>
<MTArchiveList archive_type="Monthly" sort_order="ascend">
<MTSetVarBlock name="year2"><$MTArchiveDate format="%Y" language="en"$></MTSetVarBlock>
<MTArchiveListHeader><dd></MTArchiveListHeader>
<MTIf name="year2" eq="$year">
<a href="<$MTArchiveLink$>"><$MTArchiveDate format="%B"$>月</a> 
</MTIf>
<MTArchiveListFooter></dd></MTArchiveListFooter>
</MTArchiveList>
</MTArchiveList>
</dl>

これだと以下のような感じになります。

2007年:
1月 2月 3月 4月 5月 6月
2006年:
1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月

全てMTタグのみで実装しており、プラグインは1つも使用していません。もちろん静的・動的どちらでも問題なく使えます。しかもCompareプラグインの機能までMTタグで実現できるなんて、MT4最高~(笑)。
アップグレードしてよかったです。^^

■本題2:年を降順・月を昇順にして月アーカイブをコンパクト化する(4.1~)
4.1からは年アーカイブの中での月リストは「その年に属する月」のみ出力するようになったので、より簡単に「年を降順・月を昇順にして月アーカイブをコンパクト化」が出来るようになりました。4.1以降はこちらの方法をおすすめします。

<dl>
<MTArchiveList archive_type="Yearly">
<dt><$MTArchiveDate format="%Y"$>年:</dt>
<MTArchiveList archive_type="Monthly" sort_order="ascend">
<MTArchiveListHeader><dd></MTArchiveListHeader>
<a href="<$MTArchiveLink$>"><$MTArchiveDate format="%B"$>月</a> 
<MTArchiveListFooter></dd></MTArchiveListFooter>
</MTArchiveList>
</MTArchiveList>
</dl>

【補足説明】
4.0のダイナミックではMTArchiveDate format="%Y"にlanguage="en"を指定しないと正しく出力されないバグがありました。そのため、4.0用ではlanguage="en"を指定していますが、4.1以降はそのバグは修正されたのでlanguage="en"は省いてあります。

<注>4.2以降でこのカスタマイズを使うためには年アーカイブを作成しておく必要があります(4.1以前は年アーカイブなしでも動作していましたが、4.2以降は年アーカイブが作成されていないと動作しません)。年アーカイブを使う予定がない場合はダミー用年アーカイブを作って再構築オプションを「手動」または「公開しない」にしておきます。年アーカイブを作成したくない場合は、月リストだけで年見出しを出すカスタマイズをご利用下さい。

<2008.8.20 追記>注意書きを追加。
<2008.9.18 追記>4.1から年リストに月リストを入れ子にした場合の挙動が変更されていた(sixapartに確認して判明)ので、それに合わせて4.1以降用の記述も追記。

 

コメント

[This is good]

ありがとうございます。^^
ベータでは本当にお世話になりました~。
これからもよろしくお願い致します。

こんにちは。
しばらくMTから離れていて、浦島太郎状態。
最近ver.4.01にupしました。
そうしましたら月別アーカイブが非表示に。
この記事を参考に表示することができました。
ありがとうございます(^^

>TOMOさん
こんにちは。^^
3.3時代は月アーカイブのコンパクト化ではお世話になりました。
MT4はMTタグが強化されてプラグインなしで同じことが出来るようになったのは嬉しいですよね。
これからもよろしくお願い致します。

はじめまして。
日頃より色々と参考にさせていただいております。
ありがとうございます。

一つお聞きしたのですが、MTArchiveListタグで
offsetを使う方法をご存じありませんでしょうか。

色々と調べて見たのですが、さっぱり分からず困っております。

Archiveのindexページでは最新の月の内容だけ表示し、
Prevボタンで前月のArchiveページに飛ばそうと思い
以下のように前月へのリンクを設定しようと思ったのですが、
offsetが使用できないため下記の内容では
当月のArchiveページへリンクされてしまいます。

<MTArchiveList archive_type="Monthly" lastn="1" offset="1">

お忙しいところ恐れ入りますが、
何かヒントをいただければ幸いです。

よろしくお願い致します。

>shinさん
はじめまして。
日頃より参考にして下さっているとのこと、ありがとうございます。

前月のArchiveページにリンクを張りたいのであれば、offsetを使わなくても以下の方法でいけると思います。
<MTArchiveList archive_type="Monthly" lastn="1">
<MTArchivePrevious>
<a href="<$MTArchiveLink$>"><$MTArchiveTitle$></a>
</MTArchivePrevious>
</MTArchiveList>

あ、それとタグが消えていたのを出しておきました。よろしくです。

TAEKOさま

ありがとうございました!
教えていただいた内容で無事できました。

本当に有り難うございました!
心より感謝致します。

>shinさん
ちょっと忙しくしていたのでお返事遅れました…。
上手くいかれたようでよかったです。

お世話になります。

ご質問がありまして、コメントさせていただいています。
本件、年別表示していますが、
これの月の部分を、「あるカテゴリーのエントリー」にすることは可能でしょうか。

2007年:
カテゴリーAのエントリ-1
カテゴリーAのエントリ-2
カテゴリーAのエントリ-3
カテゴリーAのエントリ-4


2006年:
カテゴリーBのエントリ-1
カテゴリーBのエントリ-2
カテゴリーBのエントリ-3
カテゴリーBのエントリ-4


年別かつカテゴリー別といったところでしょうか。
エントリーの趣旨と若干ズレてしまってますが、
アドバイスいただけるとうれしいです。

すみません(^^ゞ
参考にさせていただいたおかげで解決しました。先走って質問してしまいすみませんでした。

プラグイン関係なくデフォルトの機能でもいろいろ試すことで解決できるものですね。

>成海さん
あ、もう解決されましたか、よかったです。
MT4は「やりたいと思うこと」のほとんどがデフォルトだけで出来るようになったので、いいですよね。
タグ組みも何通りでも試せるので、自分が一番書きやすい組み方で使っていけばいいと思います。

これをもとに、
投稿の有無にかかわらず1月~12月まで出力して、
投稿のある月だけアーカイブにリンクしようとしてるんですが、
どうもうまくいきません。

何かヒントでもいただけないでしょうか?

>noriさん
こんにちは。
ご質問の件ですが、月別アーカイブには「投稿の有無にかかわらず1月~12月まで出力」する機能はなかったと思います。
それを実現するためには<MTFor>で1~12まで出力するループを作って、それに配列や条件分枝を組み合わせることで何とか出来るかもしれません。他にも方法はいろいろ考えられると思うので、タグリファレンスなどを見ながら試してみて下さいね。
http://movabletype.jp/documentation/appendices/tags/