小粋空間: 月別アーカイブリストの年別表示にはサイドバーなどで用いる月別アーカイブリストを年別に表示する方法が紹介されている。これを参考にして自分のサイトでもやってみたのだけど、この方法はダイナミックで生成しているページではうまくいかないことが判明した。バグなのか仕様なのかよくわからないのだけど、どうもスタティックとダイナミックでは変数の振る舞いに違いがあるようで、そのことが原因になっているらしい。
ダイナミックでは変数にMTタグの値を代入しようとした場合、タグの値が代入されるのではなく、タグへのポインタが代入されるような仕組みになっているらしい。ちょうどC言語などで変数と変数へのポインタを取り違えた時のような状況が発生して、current_year と year の値が永遠に同じままになり、年を区切るためのタグが生成されなくなってしまうのだ。
そこでこれを何とかダイナミックでも使えるように、自分なりに工夫してみた。取り敢えず問題なく動作しているので、そのやり方をここに公表しておいてみる。
ウィジェットの中身を次のように記述するとうまくいった。
<mt:IfArchiveTypeEnabled archive_type="Monthly">
<mt:ArchiveList archive_type="Monthly">
<mt:ArchiveListHeader>
<div class="widget-archive-monthly widget-archive widget">
<h3 class="widget-header"><$mt:ArchiveTypeLabel$> <a href="<$mt:Link template="archive_index"$>">アーカイブ</a></h3>
<div class="widget-content">
<ul>
<mt:archiveList archive_type="Monthly">
<mt:archivePrevious><mt:archiveDate format="%Y" setvar="prev_year" /></mt:archivePrevious>
<mt:archiveDate format="%Y" setvar="current_year" />
<mt:archiveNext><mt:archiveDate format="%Y" setvar="next_year" /></mt:archiveNext>
<mt:if name="current_year" ne="$next_year">
<li><mt:archiveDate format="%Y年" />
<ul>
</mt:if>
<li><a href="<$mt:ArchiveLink$>"><$mt:archiveDate format="%m月" regex_replace="/^0/"," "$> (<$mt:ArchiveCount$>)</a></li>
<mt:if name="current_year" ne="$prev_year">
</ul>
</li>
</mt:if>
</mt:archiveList>
</ul>
</li>
</ul>
</div>
</div>
</mt:ArchiveListFooter>
</mt:ArchiveList>
</mt:IfArchiveTypeEnabled>
見てわかる通り、ポイントは MTArchiveNext タグと MTArchivePrevious タグを使うことにある。この二つのタグはアーカイブが存在しない場合の振る舞いに違いがあるようで、MTArchiveList を閉じた後で ul と li の閉じタグを記述する必要がある(青字の部分)。ただし、検証はできていないのだけど、1月からブログを始めた場合にはこのままだと閉じタグが余計に生成されてしまうことになるかも知れない。その際はこの部分を削除すればよい(はず)。
お世話になります。
現在MT5の書籍を執筆中で、本記事を参考情報として、以下の内容について掲載させていただきたいと思っております。
・ハンドルネーム
・ブログ名
・記事タイトル
・記事URL
何かありましたらメール頂ければ幸いです。
それではよろしくお願い致します。
ご連絡ありがとうございます。いつも貴サイトを参考にさせていただいております。
このような拙い記事がご著書に掲載するほどの価値があるとは思えないのですが、それが人様のお役に立つことなら、ぜひそのようにして下さい。今後ともどうぞよろしくお願いします。