以前に投稿した月別アーカイブ一覧で複数月に同じ記事を表示するという記事でカテゴリを使って月別アーカイブ一覧を作成しましたが、前後の月に移動できるようにする方法を実装してみます。
実装方法
詳しくは以前の記事で確認できますが、以下のような内容でコンテンツタイプを作成している状態です。
- 開催日(日付フィールド・必須)
- 終了日(日付フィールド)
- イベント期間(カテゴリ)
このコンテンツタイプのカテゴリ別アーカイブページで、前後のカテゴリに移動できるようにしてみます。
記事の含まれないカテゴリページは生成されない設定の想定です。
<mt:Ignore><!-- 表示しているページの年と月を取得 --></mt:Ignore> <mt:HasParentCategory> <mt:ParentCategory> <mt:SetVarBlock name="currentYear"><mt:CategoryLabel></mt:SetVarBlock> </mt:ParentCategory> </mt:HasParentCategory> <mt:SetVarBlock name="currentMonth"><mt:ArchiveTitle></mt:SetVarBlock> <mt:TopLevelCategories> <mt:Ignore><!-- prevYearが未設定の場合(ループ初回)は現在のラベル追加 --></mt:Ignore> <mt:Unless name="prevYear"> <mt:SetVarBlock name="prevYear"><mt:CategoryLabel></mt:SetVarBlock> </mt:Unless> <mt:SetVarBlock name="thisYear"><mt:CategoryLabel></mt:SetVarBlock> <mt:SubCategories> <mt:Ignore><!-- 記事のある月のみ対象にする --></mt:Ignore> <mt:if tag="CategoryCount"> <mt:Ignore><!-- 翌月へのリンク追加フラグがtrueの場合は翌月のリンクを追加 --></mt:Ignore> <mt:if name="nextFlag" eq="true"> <a href="/event/<mt:Var name="thisYear">/<mt:CategoryLabel>/"><mt:Var name="thisYear">年<mt:CategoryLabel>月へ→</a> <mt:Ignore><!-- 1回のみの追加のため追加後はフラグをfalseにしておく --></mt:Ignore> <mt:SetVar name="nextFlag" value="false"> </mt:if> <mt:Ignore><!-- 表示しているページの年月とループの年月が一致する場合 --></mt:Ignore> <mt:If name="thisYear" eq="$currentYear"> <mt:If tag="categoryLabel" eq="$currentMonth"> <mt:Ignore><!-- prevMonthが設定されていない場合は前月のページがないので追加しない --></mt:Ignore> <mt:If name="prevMonth"> <a href="/event/<mt:Var name="prevYear">/<mt:Var name="prevMonth">/">←<mt:Var name="prevYear">年<mt:Var name="prevMonth">月へ</a> </mt:If> <mt:Ignore><!-- ループの次の月を翌月リンクにするようにフラグをtrueにする --></mt:Ignore> <mt:SetVar name="nextFlag" value="true"> </mt:if> </mt:if> <mt:Ignore><!-- 前月表示用の月の更新 --></mt:Ignore> <mt:SetVarBlock name="prevMonth"><mt:CategoryLabel></mt:SetVarBlock> <mt:Ignore><!-- 前月表示用の年の更新 --></mt:Ignore> <mt:If name="prevYear" ne="thisYear"> <mt:SetVarBlock name="prevYear"><mt:Var name="thisYear"></mt:SetVarBlock> </mt:if> </mt:if> </mt:SubCategories> </mt:TopLevelCategories>
mtTopLevelCategoriesとmtSubCategoriesでループを回して、表示している年月までループがきたときに前月と翌月のリンクを出力するという流れです。
その際、ループが回る毎に前月表示用の年と月を更新しておき(35~40行目)、該当月まできた際に前月の出力(24~29行目)と翌月表示用のフラグをtrueに変更(31~32行目)して、次のループで翌月を出力(18~23行目)しています。
2020年12月~2021年4月まで記事とカテゴリを登録した状態で試してみると、1月は以下のように出力されました。
<a href="/mt/white/event/2020/12/">←2020年12月へ</a> <a href="/mt/white/event/2021/02/">2021年02月へ→</a>
12月の場合は前月が無い状態になりました。
<a href="/mt/white/event/2021/01/">2021年01月へ→</a>
4月の場合は翌月が無い状態になりました。
<a href="/mt/white/event/2021/03/">←2021年03月へ</a>
ちなみにコメントや記事内ではわかりやすく前月・翌月と表記していますが、前月や翌月のページがない(記事がない)場合もありえるため、正しくは前月・翌月とならない場合もあります。
コメントが承認されるまで時間がかかります。