top

ダイナミックで月送りカレンダー(7) マルチブログ版

月移動カレンダーに「複数ブログのエントリーを表示させたい」というご質問をいただきました。試してみたところ、<MTCalendar>は<MTMultiBlog>では期待する表示にならないようだし、blog_ids="1,2"というモディファイアも上手く効かないようです。それで<MTCalendar category="カテゴリ名">を使ってブログではなくカテゴリで振り分ける方法を提案したのですが、カレンダーをマルチブログ的に使える方法って他にないのかな?と気になっていました。

そこで<MTCalendar>の外でMultiBlogを使い、いったん変数に入れたものをカレンダー内で呼び出せないか試行錯誤。いろいろタグ組みを試してみて、なんとか静動でまともに動作してくれるものを見つけたのでメモっておきます。

■注意事項

  • 同じ日に複数のブログの記事がある場合は、ブログをまたがって日別アーカイブを生成させるのは無理なため、その日の(対象ブログの中での)最新の記事にリンクする方法のみとしています。
  • カレンダーを表示させるブログでは、対象ブログに記事がある月は1つ以上の記事を投稿しておかないと、カレンダーが生成されないため他ブログの記事を表示できないことがありますので、その点ご注意下さい。
  • 仕様かバグか分かりませんが、カテゴリアーカイブでMultiBlogを使うとエラーになるので、カテゴリアーカイブでは使えません

以下の特徴を備えています。

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

1.ウィジェットの作成
まず、以下の名前でウィジェットを作ります。

ウィジェット名:マルチブログカレンダー
(月別・ブログ記事用)

赤字の部分に表示させたいブログのIDを入れます。いくつでも指定出来ます。全てのブログを対象にする時はblog_ids="all"とします。blog_ids="1"とすれば、そのブログの記事だけを表示します。

<MTEntries blog_ids="1,3" sort_order="ascend">
<MTSetVarBlock name="cadays"><MTEntryDate format="%d"></MTSetVarBlock>
<MTSetVarBlock name="calist" key="$cadays"><a href="<$MTEntryPermalink$>" title="<MTEntryTitle>"></MTSetVarBlock>
</MTEntries>
 
<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>
<MTCalendarIfBlank>&nbsp;<MTElse>
<MTSetVarBlock name="caday"><$MTCalendarDate format="%d"$></MTSetVarBlock>
<MTSetVarBlock name="caentry"><MTGetVar name="calist" key="$caday"></MTSetVarBlock>
<MTIf name="caentry">
<MTGetVar name="caentry"><$MTCalendarDay$></a>
<MTElse><$MTCalendarDay$>
</MTIf>
</MTElse></MTCalendarIfBlank></td>
<MTCalendarWeekFooter></tr></MTCalendarWeekFooter>
</MTCalendar>
</table>
</div>
</div>

まず該当月の記事を対象のブログからリストアップし、投稿日をkeyに指定してます。MTCalendar内でkeyが<$MTCalendarDate$>に一致する(=記事が存在する)場合のみリンクを張るようにしてます。 sort_order="ascend"を指定しているのは$cadayと一致する記事が複数あった場合、新しい方の記事へリンクをはるためです。

ウィジェット名:マルチブログカレンダー現在の月
(メインページ用)

<MTSetVarBlock name="thismonth"><$MTDate format="%Y%m"$></MTSetVarBlock>
<MTEntries blog_ids="1,3" sort_order="ascend" lastn="50">
<MTSetVarBlock name="month"><$MTEntryDate format="%Y%m"$></MTSetVarBlock>
<MTIf name="month" eq="$thismonth">
<MTSetVarBlock name="cadays"><MTEntryDate format="%d"></MTSetVarBlock>
<MTSetVarBlock name="calist" key="$cadays"><a href="<$MTEntryPermalink$>" title="<MTEntryTitle>"></MTSetVarBlock>
</MTIf>
</MTEntries>
 
<div class="widget-calendar widget">
<h3 class="widget-header">カレンダー</h3>
<div class="widget-content">
<table summary="リンク付きのカレンダー">
<caption>
<MTArchiveList archive_type="Monthly">
<MTUnless name="prev">
<MTSetVarBlock name="prevmonth"><$MTArchiveDate format="%Y%m"$></MTSetVarBlock>
<MTIf name="prevmonth" lt="$thismonth">
<a href="<$MTArchiveLink archive_type="Monthly"$>">&lt;</a>&nbsp;&nbsp;
<MTSetVar name="prev" value="1">
</MTIf>
</MTUnless>
</MTArchiveList>
<$MTDate format="%B %Y"$>
<MTArchiveList archive_type="Monthly" sort_order="ascend">
<MTUnless name="next">
<MTSetVarBlock name="nextmonth"><$MTArchiveDate format="%Y%m"$></MTSetVarBlock>
<MTIf name="nextmonth" gt="$thismonth">
&nbsp;&nbsp;<a href="<$MTArchiveLink archive_type="Monthly"$>">&gt;</a>
<MTSetVar name="next" value="1">
</MTIf>
</MTUnless>
</MTArchiveList>
</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>
<MTCalendarWeekHeader><tr></mt:CalendarWeekHeader>
<td>
<MTCalendarIfBlank>&nbsp;<MTElse>
<MTSetVarBlock name="caday"><$MTCalendarDate format="%d"$></MTSetVarBlock>
<MTSetVarBlock name="caentry"><MTGetVar name="calist" key="$caday"></MTSetVarBlock>
<MTIf name="caentry">
<MTGetVar name="caentry"><$MTCalendarDay$></a>
<MTElse><$MTCalendarDay$>
</MTIf>
</MTElse></MTCalendarIfBlank></td>
<MTCalendarWeekFooter></tr></MTCalendarWeekFooter>
</MTCalendar>
</table>
</div>
</div>

*現在の月用のカレンダーなので、対象になっているブログの記事から「現在の月」にマッチする記事のみをリストアップしています。青字の部分は最新1ヶ月分くらいをカバーできるようにlastn="50"としていますが、未来にも記事がある場合は必要に応じて数を増やすといいと思います。

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

<MTIf name="datebased_monthly_archive">
<$MTInclude widget="マルチブログカレンダー"$>
</MTIf>
<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>
</MTIf>
<MTIf name="main_index">
<$MTInclude widget="マルチブログカレンダー現在の月"$>
</MTIf>
<MTIf name="archive_index">
<$MTInclude widget="マルチブログカレンダー現在の月"$>
</MTIf>

*このカレンダーの特徴から考えて、表示するアーカイブは「月別アーカイブ」「ブログ記事」「メインページ」「アーカイブページ」の4つに絞って決め打ちしています。アーカイブページには要らない、という場合は最後の3行を削って下さい。

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

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

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

080822_2.gif

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

【備考】
普通のブログに取り入れるというよりは、他のブログの記事を違うブログにまとめてカレンダー形式で表示したい、みたいな特殊な用途向きかなと思います。使い道が思い浮かんだ方は試してみて下さい(^^;。

 

コメント

非常に有用な情報をありがとうございます。
今こちらの記事を参考に現在カレンダーを作成中ですが、途中でふと思ったのですが、カレンダー内にブログ記事のタイトルを表示させることは可能でしょうか?
もし可能ならば月間スケジュールカレンダーのように使用できるかと思ったのですが、いかがでしょうか?

こんにちは。
うちのカレンダーでは日にポインタを当てればブログ記事タイトルを表示するようになってますが、それでは不十分でカレンダーに直接テキストで表示させたいということでしょうか?

これはマルチブログ対応のため複雑なタグ組になってますが、試してみたところ、やってやれないことはないですね…。普通の月移動カレンダーなら簡単に出来るのですが。

ただ、カレンダーに記事タイトルを表示する場合、タイトルが長いと枠に収まりきれなくてレイアウトが崩れたりすると思うのですが、その辺は問題ないのでしょうか。
サイドバーに表示するのではなく、スケジュールカレンダーとして頁いっぱいに大きく表示するとなるとデザインとの絡みも出てくるので、コメント欄で簡単に説明できるようなことではなくなってしまうのですが、その辺はどうお考えでしょうか。