top

月別アーカイブを年毎に区切ってみる(4) 1~12月表示版

少し前にこちらのパターンを使ったもので「投稿の有無にかかわらず1月~12月まで出力して、投稿のある月だけリンクしたい」というご質問を受けていたのですが、すぐには方法が思いつかず、しばらくの間そのままになっていました。この場合、MTArchiveListには「投稿の有無にかかわらず月を出力」という機能はないため、ご要望のことをするにはストレートにMTArchiveListを使う方法では難しいと思います。

とりあえず<MTFor>で1~12まで出力するループは作れそうだなと思ったものの、それに投稿のある月・ない月をどう関連付けていけばいいのか…? いろいろ試してみましたが、静的なら期待した表示になるのに動的だと上手くいかない、というケースもけっこうあって難儀。試行錯誤の末、静・動両方で同じ表示になってくれるタグ組みを見つけたので、忘れないうちに覚え書きしておきます。

追記:
4.0当時は年アーカイブに月アーカイブを入れ子にした場合、「その年に属する月」ではなく、「全ての月リスト」が出力されていました。そのため最初に考案した時点では「その年に属する月」を求めるのに月リストではなくMTEntriesを用いていたのですが、後になって4.1以降は月リストだけで「その年に属する月」が求められるように仕様変更されていたことに気付いたので、より適切と思われるタグ組みに変更させていただきました。(2008.9.18)

サンプルは以下。

<dl>
<MTArchiveList archive_type="Yearly">
<dt><$MTArchiveDate format="%Y"$>年</dt>
<MTSetVarBlock name="month"><MTArchiveList archive_type="Monthly">-<$MTArchiveDate format="%B"$>-</MTArchiveList></MTSetVarBlock>
<dd>
<MTFor var="i" from="1" to="12">
<MTSetVarBlock name="monthno">-<$MTVar name="i"$>-</MTSetVarBlock>
<MTIf name="month" like="$monthno">
<a href="<$MTBlogURL$><$MTArchiveDate format="%Y"$>/<MTVar name="i" zero_pad="2">/"><MTVar name="i">月</a> 
<MTElse><MTVar name="i">月 
</MTIf>
</MTFor>
</dd>
</MTArchiveList>
</dl>

表示見本はこのようになります。↓

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

*テストサイトで出力したものなので、リンク先は#に変えてあります。

■ 説明とか。
年見出し用には<MTArchiveList archive_type="Yearly">を使うことにして、その中で<MTEntries><MTArchiveList archive_type="Monthly">を使って、その年に属するエントリーの月を全て取得します月を求めます(緑字の部分)。
次に<MTFor>で1~12までのループを作り、その中で変数 i と同じ数字の月があるかどうか調べて、あればリンクを張って出力、なければ数字のみ出力します。

:4.2以降ではarchive_type="Yearly"を使えるようにするためには年アーカイブを作成しておく必要があります。archive_typeにYearlyを使いたいだけで、年アーカイブ自体は使う予定はない、という場合は再構築オプションを「手動」または「使用不可」にしておくと不要なアーカイブを再構築されずに済みます。

*この方法の場合、MTArchiveLinkでは月アーカイブへのリンクを出すことができません。そのため<$MTBlogURL$><$MTArchiveDate format="%Y"$>を使って月アーカイブへのリンクを決め打ちする方法をとっています。
赤字の部分が月アーカイブへのリンク先になるので、マッピングをカスタマイズしている場合は、カスタマイズしたURLに合わせて赤字の部分を調整して下さい(このサンプルではデフォルトのマッピングに合わせてあります)。

*月を取得する際、そのままでは数字の羅列になって月の判別がつかなくなるので、全角の()で囲ってIDの前後に-(ハイフン)をつけて区切りの目印にしています(そうしないと1月がないのに12月がある場合、12の1に反応して1月が存在すると判定されてしまうため)。

*<MTVar name="i">で出力される数字は1から始まるので、01、02 …と表示したい場合はzero_pad="2"をつけて調整します。

もっといい方法が思い浮かべば、またエントリーしていきたいと思います。

■追記:月アーカイブのみ版
年アーカイブを使わず、月アーカイブのみで作る方法を追記しました。こちらの月リストのみで年見出し版をベースにしています。年見出しのためだけに使う予定のない年アーカイブを作りたくない、という場合向けに。

<MTSetVarBlock name="year"><MTArchiveList archive_type="Monthly" lastn="1"><$MTArchiveDate format="%Y"$></MTArchiveList></MTSetVarBlock>
 
<MTArchiveList archive_type="Monthly">
<MTArchiveListHeader>
<dl>
<dt><$MTArchiveDate format="%Y"$>年</dt>
</MTArchiveListHeader>
<MTSetVarBlock name="thisyear"><$MTArchiveDate format="%Y"$></MTSetVarBlock>
 
<MTIf name="year" ne="$thisyear">
<dd>
<MTFor var="i" from="1" to="12">
<MTSetVarBlock name="monthno">-<$MTVar name="i"$>-</MTSetVarBlock>
<MTIf name="month" like="$monthno">
<a href="<$MTBlogURL$><$MTGetVar name="year2"$>/<MTVar name="i" zero_pad="2">/"><MTVar name="i">月</a> 
<MTElse><MTVar name="i">月 
</MTIf>
</MTFor>
</dd>
<MTSetVar name="month" value="">
<dt><$MTArchiveDate format="%Y"$>年</dt>
<MTSetVarBlock name="year"><$MTArchiveDate format="%Y"$></MTSetVarBlock>
</MTIf>
 
<MTSetVarBlock name="month" append="1">-<$MTArchiveDate format="%B"$>-</MTSetVarBlock>
<MTSetVarBlock name="year2"><$MTArchiveDate format="%Y"$></MTSetVarBlock>
 
<MTArchiveListFooter>
<dd>
<MTFor var="i" from="1" to="12">
<MTSetVarBlock name="monthno">-<$MTVar name="i"$>-</MTSetVarBlock>
<MTIf name="month" like="$monthno">
<a href="<$MTBlogURL$><$MTGetVar name="year2"$>/<MTVar name="i" zero_pad="2">/"><MTVar name="i">月</a> 
<MTElse><MTVar name="i">月 
</MTIf>
</MTFor>
</dd>
</dl>
</MTArchiveListFooter>
</MTArchiveList>

赤字の部分が月アーカイブへのリンクになりますので、各自の環境に合わせて調整して下さい。サンプルではデフォルトのマッピングに合わせてあります。2か所ありますが、2つとも同じ記述にして下さい。

<2008.8.20>年リストのみで作成できる版を追加。
<2008.8.23>記事ID識別記号を全角から半角へ変更。
<2008.9.7>「年」となるべきところが「月」になっていたのを修正。
<2008.9.18>年アーカイブ使用版を4.1以降の仕様に合わせてより適切なタグ組みになるよう修正。

 

トラックバックの一覧

トラックバック 年毎の月別リスト(何)の完成...と覚書(^^;  »» 2008年10月 1日 23:50
何の話かというと,7月頃に書いたこれのこと. 2008年7月12日(土) - ...

コメント

こんにちは。いつもお世話になっています。
今回のカスタマイズ、「絶対できるはず、そのうち考えてみよう」と思ってほったらかしにしてたのでうれしいです。

ところで注意書きの「4.2以降では・・・年アーカイブを作成しておく必要があります。」の件4.1でも一緒だと思ってました。ちがったんですね。

こんばんは。^^
これ、けっこう需要ありそうですよねえ。

>年アーカイブ
4.2を触っていて、今になって4.0~4.1では年アーカイブなしにarchive_type="Yearly"が使えていたことに気付いた私です(笑)。でもこれ、理屈から見たら4.2の動作の方が正しいんでしょうね(^^;。
これまで考えなしにYearlyを使いまくっていたので、4.2にする前に年アーカイブを作るのを忘れないようにしないとなーと思っているこの頃です。

いつもMTのカスタマイズでお世話になってます!

この方法で1〜4月のエントリー、5〜9月のエントリーなど期間別にエントリーをインデックステンプレートに書き出すことは可能ですかね〜

>Akikoさん
こんにちは。
当ブログがカスタマイズの参考に少しでもお役に立てていれば嬉しいです。^^

特定の月の期間のエントリーを出す方法はいろいろあるのですが、この方法でとなると、<MTFor>の仕様上、エントリーの並び順は昇順でしか出せないようです。エントリーの並びを降順にしたければこの方法では難しいと思います。

このカスタマイズは「月リストを投稿のあるなしに関係なく表示させる」ために考え出したものなので、エントリーを特定の月間表示させるだけならMTEntries内の条件分枝だけでも出来ると思います。

2008年1~4月のエントリー
<ul>
<MTEntries lastn="0">
<MTSetVarBlock name="ymdate"><$MTEntryDate format="%Y%m"$></MTSetVarBlock>
<MTIf name="ymdate" ge="200801"><MTIf name="ymdate" le="200804">
<li><$MTEntryTitle$></li>
</MTIf></MTIf>
</MTEntries>
</ul>

これは一例ですが、お使いの目的に合わせていろいろ工夫してみて下さい。

はじめまして!
大変勉強になります。
御指導ありがとうございます!

月の表示の部分を12月から表示するようにはできないですかね・・?

>takumiさん
こちらこそ初めまして。
Akikoさん宛てのコメントで述べている通り、これは<MTFor>を使っているので、月を降順(12月からの表示)にするのは無理のようです。

このカスタマイズは「月リストを投稿のあるなしに関係なく表示させる」ためのものなので、投稿のない月は表示されなくてよいのなら、以下の方法で月の表示を降順にも昇順にも出来ます。
http://wing.w-museum.com/200808191315.html
少しでも参考になれば嬉しいです。