top

ダイナミックで月送りカレンダー(4) MT4版

いや、ダイナミックだけじゃなくて静的生成でも使えますが、タイトルの継承の都合上、こうなっております(^^;。今回の覚え書きは「ダイナミックで月送りカレンダー(3) 非iframe版」の改訂版です。

080822_1.gif

これはごくシンプルで簡単な月送りカレンダーなのですが、1点だけネックがありまして、それが月送り部分を担当しているMTArchivePreviousMTArchiveNext
これは本来、日付アーカイブ系の中でしか使えません。そのはずなんですが、過去のバージョンではけっこうブログ記事でも使えてしまっていて(4.1でも動作してました>汗)、そのおかげで月アーカイブだけでなく「どこでも月移動カレンダー状態」になってしまっていました。
が、さすがに4.2になってタグチェックが厳しくなって、日付系の外で使うとエラーするようになったので(それで当たり前なんですが)、4.2になったのを機に正しく動作するタグ組みに修正しました。

  • 前月・次月のリンクをクリックすると、その月のアーカイブに飛ぶという最も基本的な形の月送りカレンダーです。
  • カレンダー用のアーカイブテンプレートを作る必要がありません。
  • ウィジェットを組み込むだけなので簡単に設置できます。
  • javascriptもAjaxもPHPも使ってないのでどの環境でも使えます。
  • 月別・日別・エントリーアーカイブではその月に合致したカレンダーが表示されます。
  • メインページ・カテゴリでは前月へのリンク付きの最新のカレンダーが表示されます。

ここでは MT4デフォルトで使えるようウィジェットとして作成してますが、もちろんテンプレートに直接書いてもOKです。その場合は「カレンダー月移動」ウィジェットの内容を見ながらテンプレートに合わせてカレンダーを条件分枝で囲って下さい。

1.ウィジェットの作成
まず、以下の名前でウィジェットを2つ作ります(ウィジェット名は自分で分かりやすいものに変えてもらってかまいません)。

ウィジェット名:月移動カレンダー

<div class="widget-calendar widget">
<h3 class="widget-header">カレンダー</h3>
<div class="widget-content">
<table summary="リンク付きのカレンダー">
<caption>
<MTArchivePrevious archive_type="Monthly">
<a href="<$MTArchiveLink archive_type="Monthly"$>">&lt;</a>&nbsp;&nbsp;
</MTArchivePrevious>
<$MTCalendarDate format="%B %Y"$>
<MTArchiveNext archive_type="Monthly">
&nbsp;&nbsp;<a href="<$MTArchiveLink archive_type="Monthly"$>">&gt;</a>
</MTArchiveNext>
</caption>
<tr>
<th abbr="日曜日">日</th>
<th abbr="月曜日">月</th>
<th abbr="火曜日">火</th>
<th abbr="水曜日">水</th>
<th abbr="木曜日">木</th>
<th abbr="金曜日">金</th>
<th abbr="土曜日">土</th>
</tr>
<MTCalendar month="this">
<MTCalendarWeekHeader><tr></mt:CalendarWeekHeader>
<td><MTCalendarIfEntries>
<MTEntries lastn="1"><a href="<$MTEntryPermalink$>" title="<$MTEntryTitle$>"><$MTCalendarDay$></a></MTEntries>
</MTCalendarIfEntries>
<MTCalendarIfNoEntries><$MTCalendarDay$></MTCalendarIfNoEntries>
<MTCalendarIfBlank>&nbsp;</MTCalendarIfBlank></td>
<MTCalendarWeekFooter></tr></MTCalendarWeekFooter>
</MTCalendar>
</table>
</div>
</div>

ウィジェット名:カレンダー月移動

<MTIf name="datebased_only_archive">
<$MTInclude widget="月移動カレンダー"$>
<MTElse>
<MTIf name="entry_template">
<MTSetVarBlock name="thismonth"><$MTEntryDate format="%Y%m"$></MTSetVarBlock>
<MTArchiveList archive_type="Monthly">
<MTSetVarBlock name="month"><$MTArchiveDate format="%Y%m"$></MTSetVarBlock>
<MTIf name="month" eq="$thismonth">
<$MTInclude widget="月移動カレンダー"$>
</MTIf>
</MTArchiveList>
<MTElse>
<MTArchiveList archive_type="Monthly" lastn="1">
<$MTInclude widget="月移動カレンダー"$>
</MTArchiveList>
</MTIf>
</MTIf>

*緑字:月アーカイブ用、赤字:ブログ記事用、青字:メイン・カテゴリ用

スタイルシートに以下を追加(内容はお好みで)。

.widget-calendar table {
width: 100%;
}
.widget-calendar caption {
text-align: center;
padding-top:5px;
font-size:12px;
}

2.ウィジェットのセット

080822_2.gif

「カレンダー月移動」ウィジェットを好きなところに配置。保存ボタンを押してブログを開けば各頁にカレンダーが表示されてます(静的の場合は再構築が必要です)。

【補足】
カレンダーのリンク先を日別アーカイブに変えたい場合は、テンプレートで日別アーカイブを作成した後、赤字の部分を以下のものと差し替えます。

<MTEntries><MTDateHeader>
<a href="<$MTEntryLink archive_type="Daily"$>" title="</MTDateHeader>[<$MTEntryTitle$>]<MTDateFooter>">
<$MTCalendarDay$></a></MTDateFooter>
</MTEntries>

*静的生成の場合、日別アーカイブを作ると再構築するファイルが倍近くに増えてMTに負担がかかりますので、注意が必要です。日別アーカイブのように、カレンダーのためだけに存在し滅多にアクセスされないファイルはダイナミックが向いていると思います。

<追記>
現在の月を表示する版をエントリーしました。トップページやカテゴリに「最新の月」ではなく「現在の月」のカレンダーを表示したい場合に使えます。