条件に合う記事を元にカレンダーを出力するプラグイン(その1)

昨日、MTQに以下のような質問が上がっていました。

カスタムフィールドの日付を使用した、カレンダーを作成したいと考えているのですが、通常のカレンダーでは公開日を元にカレンダーに表示しているようでした。
書籍等で、方法を探っていますが、現状、良い案が無く困っております。

パフォーマンスを無視すれば、Movable Typeの標準のテンプレートタグだけでも、上記のようなカレンダーを出力することは可能だと思います。
ただ、ブログ記事が多くなると、パフォーマンスが低下するはずです(ブログ記事を全部読み込んでから、ハッシュや条件判断を駆使して処理するため)。
また、テンプレートの組み方もかなり複雑になると思われます。

そこで、拙作のSearchEntriesプラグインと組み合わせて、条件に合う記事を元にしてカレンダーを出力するプラグインを作ってみました。
今日はその基本を紹介します。

1.プラグインの概要

このプラグインでは、SearchEntriesプラグインで検索したブログ記事を、月ごとにまとめて出力したり、月ごとのカレンダーを出力したりすることができます。
また、月ごとにブログ記事をまとめる際には、公開日だけでなく、ブログ記事の日付系の任意のフィールド(カスタムフィールドも含む)を指定することもできます。

なお、動作確認はMovable Type 5.2ベータ5で行いました。
5.0xや5.1xでも動作するはずです。

2.インストール

このプラグインは、以下からダウンロードします。

SearchEntriesCalendar_1_01.zip

ダウンロードしたZipファイルを解答すると、「plugins」というフォルダができます。
このフォルダを、Movable Typeのインストール先ディレクトリにアップロードします。

また、最初に述べたように、このプラグインはSearchEntriesプラグインと組み合わせて使います。
したがって、SearchEntriesプラグインもインストールしておく必要があります。

3.基本的なテンプレートの組み方

このプラグインを使ってカレンダーを出力するには、基本的には以下のようなテンプレートの組み方をします。

<mt:SearchEntries>
  各種の検索条件
</mt:SearchEntries>

<mt:SearchEntriesArchiveList field="フィールド名">
  年月を出力するタグなど
  <mt:SearchEntriesCalendar>
    カレンダーを出力する各種のタグ
  </mt:SearchEntriesCalendar>
</mt:SearchEntriesArchiveList>

MTSearchEntriesArchiveListタグは、検索にマッチしたブログ記事を、月ごとに分けて順に出力する働きをします。
fieldモディファイアで、ブログ記事を月ごとにまとめるためのフィールド名を指定します。
カスタムフィールドでまとめる場合は、「field="field:カスタムフィールドのベースネーム"」のように指定します。
fieldモディファイアを省略した場合は、ブログ記事の公開日で月ごとにまとめて出力します。

MTSearchEntriesArchiveListタグのブロックの中では、MTArchiveDateタグを使って、個々の月の日付を出力することができます。
また、「MTSearchEntriesCalendar」というブロックタグを使って、個々の月のカレンダーを出力することもできます。

MTSearchEntriesCalendarタグのブロックの中では、MTCalendarタグと同じ書き方で(MTCalendar系のテンプレートタグを使って)、カレンダーを出力することができます。
ただし、MTCalendarDay/MTCalendarDateタグの値は、ブログ記事の公開日ではなく、MTSearchEntriesArchiveListタグのfieldモディファイアで指定したフィールドの値が元になります。

4.事例

2012年に書いたブログ記事のうち、コメントがついている記事を検索して、それらの記事のカレンダーを出力するには、以下のようにテンプレートを組みます。

<mt:SearchConditions>
  <$mt:SearchConditionCompare field="authored_on" ge="20120101000000" lt="20130101000000"$>
  <$mt:SearchConditionCompare field="comment_count" ge="1"$>
</mt:SearchConditions>

<mt:SearchEntriesArchiveList>
  <h1><$mt:ArchiveDate format="%Y年%m月"$></h1>
  <table border="1">
    <tr><th>日</th><th>月</th><th>火</th><th>水</th><th>木</th><th>金</th><th>土</th></tr>
    <mt:SearchEntriesCalendar>
      <mt:CalendarWeekHeader><tr></mt:CalendarWeekHeader>
      <td<mt:CalendarIfToday> class="today"</mt:CalendarIfToday>>
        <mt:CalendarIfBlank>&nbsp;</mt:CalendarIfBlank>
        <mt:CalendarIfEntries><mt:Entries lastn="1"><a href="<$mt:EntryPermalink$>"><$mt:CalendarDay$></a></mt:Entries></mt:CalendarIfEntries>
        <mt:CalendarIfNoEntries><$mt:CalendarDay$></mt:CalendarIfNoEntries>
      </td>
      <mt:CalendarWeekFooter></tr></mt:CalendarWeekFooter>
    </mt:SearchEntriesCalendar>
  </table>
</mt:SearchEntriesArchiveList>

5.ライセンス

このプラグインは、商用ライセンスのMovable Typeと組み合わせる場合は、インストール先1件につき1,000円とさせていただきます。
お問い合わせはメールフォームから行ってください。

一方、個人無償ライセンスやMTOSと組み合わせる場合は、無償とさせていただきます。