linkerは「人と人」「人と情報」「人と物」をつなぐデザインユニットです。

Movable Typeで今月と来月の記事を一覧表示させてみる

みなさん、こんにちは、まーしーです。

さて、MTQを見ていたらこんな質問があがっていました。

最近MT勉強中なのですがウェブサイトテンプレートでブログの今月の記事と来月の記事を表示する方法がわからないのですがどちらかご教授願えますでしょうか。

今月と来月の記事一覧表示 - MTQ | Movable Type 5 ユーザーコミュニティ
http://communities.movabletype.jp/2012/02/post-537.html

どうやればいいかなぁ、と思ったので少しかんがえてみました。
再構築のコストとか気になるところもあるので、正解とは言いにくい気がするのですがメモとして残しておこうと思います。

ひとまず、サンプルのエントリーはこんな感じで用意しました。

120202-01.jpg

ソースはこんな感じです。

<mt:SetVarBlock name="thisMonth"><MTDate format="%Y%m"></mt:SetVarBlock>
<mt:Blogs blog_ids="2">
<MTArchiveList archive_type="Monthly"><mt:SetVarBlock name="Month"><MTArchiveDate format="%Y%m"></mt:SetVarBlock>
<MTIf name="Month" eq="$thisMonth"><mt:ArchiveNext><mt:SetVarBlock name="nextMonth"><MTArchiveDate format="%Y%m"></mt:SetVarBlock></mt:ArchiveNext></mt:If>
</mt:ArchiveList>
<MTArchiveList archive_type="Monthly"><mt:SetVarBlock name="Month"><MTArchiveDate format="%Y%m"></mt:SetVarBlock>
<mt:If name="Month" eq="$nextMonth">
<h2><mt:ArchiveTitle></h2>
<mt:Entries>
<div>
<h3><mt:EntryTitle></h3>
<p><mt:EntryBody></p>
<div>
</mt:Entries>
</mt:If>
<mt:If name="Month" eq="$thisMonth">
<h2><mt:ArchiveTitle></h2>
<mt:Entries>
<div>
<h3><mt:EntryTitle></h3>
<p><mt:EntryBody></p>
<div>
</mt:Entries>
</mt:If></MTArchiveList></mt:Blogs>

MTArchiveListを2回まわしているところはもう少し上手くやれそうなきがしますが。
こちらをウェブサイトのインデックステンプレートに書いてみました。
サンプルブログのblogIDが2なのでとりあえず直接blogIDを指定しています。

最初に
<mt:SetVarBlock name="thisMonth"><MTDate format="%Y%m"></mt:SetVarBlock>
でthisMonthに今月の値をセットしておきます。

<MTArchiveList archive_type="Monthly"><mt:SetVarBlock name="Month"><MTArchiveDate format="%Y%m"></mt:SetVarBlock>
<MTIf name="Month" eq="$thisMonth"><mt:ArchiveNext><mt:SetVarBlock name="nextMonth"><MTArchiveDate format="%Y%m"></mt:SetVarBlock></mt:ArchiveNext></mt:If>
</mt:ArchiveList>

ここでループの中で今月の時にその翌月の値をnextMonthにセットします。
このnextMonthがもう少し上手くとれればいいと思うのですが、ひとまずこれでやっておきます。

thisMonthとnextMonthを取得出来たので、ループの中でMonthに毎回、年月をセットしてnextMonth、thisMonthとイコールの時にそれぞれmtentriesが動く様にしてみました。

<mt:If name="Month" eq="$nextMonth">

<mt:If name="Month" eq="$thisMonth">

でやってるところもあまりキレイではないですし、その中の

<h2><mt:ArchiveTitle></h2>
<mt:Entries>
<div>
<h3><mt:EntryTitle></h3>
<p><mt:EntryBody></p>
<div>
</mt:Entries>

は共通なのでtemplateで持たせてもいいでしょうね。

ひとまずこれで良さそうな気はしています。
再構築のコストなどは考えた方が良さそうな気もしますが、、、

常に2ヶ月である場合

あとは要件次第なきもしますが、例えば常に1ヶ月先のエントリーしか無いのであれば

<mt:Blogs blog_ids="2">
<MTArchiveList archive_type="Monthly"><mt:If name="__counter__" le="2">
<h2><mt:ArchiveTitle></h2>
<mt:Entries>
<div>
<h3><mt:EntryTitle></h3>
<p><mt:EntryBody></p>
<div>
</mt:Entries>
</mt:If></MTArchiveList></mt:Blogs>

みたいなかんじで、最初から2ヶ月分と限定してしまってもいいのかもしれません。

今月より将来を表示させる場合

今回の話は今月と来月ということでしたが、例えば今月より将来ということであれば

<mt:SetVarBlock name="thisMonth"><MTDate format="%Y%m"></mt:SetVarBlock>
<mt:SetVar name="hoge" value="0">
<mt:Blogs blog_ids="2">
<MTArchiveList archive_type="Monthly"><mt:SetVarBlock name="Month"><MTArchiveDate format="%Y%m"></mt:SetVarBlock>
<mt:Unless name="hoge" eq="1">
<h2><mt:ArchiveTitle></h2>
<mt:Entries>
<div>
<h3><mt:EntryTitle></h3>
<p><mt:EntryBody></p>
<div>
</mt:Entries>
<MTIf name="Month" eq="$thisMonth"><mt:SetVar name="hoge" value="1"></mt:If>
</mt:Unless>
</MTArchiveList></mt:Blogs>

こんなかんじで書くことも出来るかもしれません。
hogeの値がイコールで無い場合、ひとまず最初から回していって、今月の時にhogeに値をセットしてあげれば、それ以降は生成されなくなりますね。

スマートな方法だとは思えないところもありますし、ひとまず思いついた方法で書いてみただけですが考えるきっかけになれば幸いです。