以前にイベント情報を掲載するコンテンツの月別アーカイブページを作成する記事を掲載しましたが、イベントの期間が複数月に渡る場合にその複数月のアーカイブページに同じイベントを表示したいということがあったので、その際に行った対応方法をメモしておきます。
作成内容
元々の設定について詳しくは以前の記事で確認できますが、「イベント情報」という名前で以下のようなコンテンツフィールドを作成していました。
- 開催日(日付フィールド・必須)
- 終了日(日付フィールド)
今回やりたかったのは、「開催日」と「終了日」で設定した日付の期間内に含まれる月のアーカイブページ全てにイベント情報を掲載することです。
例えば前回の記事のイベント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>
コメントが承認されるまで時間がかかります。