以前にイベント情報を掲載するコンテンツの月別アーカイブページを作成する記事を掲載しましたが、イベントの期間が複数月に渡る場合にその複数月のアーカイブページに同じイベントを表示したいということがあったので、その際に行った対応方法をメモしておきます。
作成内容
元々の設定について詳しくは以前の記事で確認できますが、「イベント情報」という名前で以下のようなコンテンツフィールドを作成していました。
- 開催日(日付フィールド・必須)
- 終了日(日付フィールド)
今回やりたかったのは、「開催日」と「終了日」で設定した日付の期間内に含まれる月のアーカイブページ全てにイベント情報を掲載することです。
例えば前回の記事のイベントBの場合、開催日が「2021-03-27」で終了日が「2021-04-03」なので、2021年3月と2021年4月の月別アーカイブ一覧に表示になります。
実装方法
実装方法を調べてみた限り、複数のフィールドの範囲でアーカイブ一覧を作成というのが難しそうでした。
そのため今回は、元々作成していた「開催日」「終了日」の日付フィールドとは別に、月別アーカイブページの振り分け用に年月のカテゴリを用意して実装してみます。
「イベント期間」という名前でカテゴリセットを作成して、以下のような項目を登録します。
- 2021
- 03
- 04
親カテゴリが年、子カテゴリが月になっていますので、必要に応じて増減してください。
次に「イベント情報」のコンテンツタイプに「イベント期間」という名前で先ほど作成したカテゴリを追加します。
仕様上複数月を選択できる必要があるので、カテゴリを追加する際に複数選択を許可するようにしてください。
投稿画面は以下のようになりました。

前回ダミー用に投稿したコンテンツのカテゴリを選択しておきます。
- ラベル:イベントA 開催日:2021-03-06 イベント期間:03
- ラベル:イベントB 開催日:2021-03-27 終了日:2021-04-03 イベント期間:03,04
- ラベル:イベントC 開催日:2021-03-13 終了日:2021-03-20 イベント期間:03
次に前回作成した「イベント月別一覧」のテンプレートを編集します。
新しくアーカイブマッピングを作成して、種類を「コンテンツタイプ カテゴリ別」、カテゴリフィールドを「イベント期間」にして追加をクリックします。
カテゴリフィールドの場合は日付フィールドと違い、必須でなくても選択可能です。

テンプレート内容はほぼ同じですが、mt:ArchiveTitleの内容が以前と変わるので修正しています。
<!DOCTYPE HTML>
<html lang="ja">
<head>
<meta charset="UTF-8">
</head>
<body>
<h1><mt:ArchiveTitle>月</h1>
<mt:Contents content_type="イベント情報" sort_by="field:開催日" sort_order="ascend">
<mt:ContentsHeader><ul></mt:ContentsHeader>
<li>
<h2><mt:ContentLabel></h2>
<div>
<mt:ContentField content_field="開催日">
<mt:ContentFieldValue format="%Y年%m月%d日">
</mt:ContentField>
<mt:ContentField content_field="終了日">
~ <mt:ContentFieldValue format="%Y年%m月%d日">
</mt:ContentField>
</div>
</li>
<mt:ContentsFooter></ul></mt:ContentsFooter>
</mt:Contents>
</body>
</html>
これでテンプレートの変更が完了したので、再構築を行います。
以下のような内容で月別のアーカイブページが作成できました。
<h1>03月</h1>
<ul>
<li>
<h2>イベントA</h2>
<div>
2021年03月06日
</div>
</li>
<li>
<h2>イベントC</h2>
<div>
2021年03月13日 ~ 2021年03月20日
</div>
</li>
<li>
<h2>イベントB</h2>
<div>
2021年03月27日 ~ 2021年04月03日
</div>
</li>
</ul>
4月の場合の出力も問題なさそうです。
<h1>04月</h1>
<ul>
<li>
<h2>イベントB</h2>
<div>
2021年03月27日 ~ 2021年04月03日
</div>
</li>
</ul>
コメントが承認されるまで時間がかかります。