記事一覧ページで会計年度別に表示する方法

YYYY年3月期でコンテンツをmtevalモディファイアも用いないで分類したい。

前回、https://cms-note.com/movabletype/mtfiscalyear.htmlでは、mtevalモディファイアも用いてシンプルに実装をしました。 今回はmtevalを使用せず、より基本的な使い方で実現できる方法をご紹介します。

MovableType、PowerCMSで動作します。

■ 2021年3月期
-- yyyy年mm月dd日 決算短信
-- yyyy年mm月dd日 有価証券報告書

■ 2020年3月期
-- yyyy年mm月dd日 決算短信

サンプルテンプレート

記事に登録されているコンテンツの公開日を元に、会計年度別の表示を行います。

<mt:Entries lastn="0">          
    <mt:ignore>04/01以降の記事は次会計年度として扱います。</mt:ignore>
    <mt:EntryDate format="%Y" setvar="archive_year">
    <mt:EntryDate format="%m" setvar="if_entrydate_md">
    <mt:if name="if_entrydate_md" ge="04">
        <mt:Var name="archive_year" op="+" value="1" setvar="archive_year">
    </mt:if>
    <mt:ignore>会計年度を配列に格納します。</mt:ignore>
    <mt:SetVar name="push(years)" key="$archive_year">

    <mt:ignore>コンテンツ部分:key-記事の順番,value-記事の内容</mt:ignore>
    <mt:SetVarBlock name="key"><mt:EntryDate format="%Y%m%d%H%M%S"><mt:EntryID zero_pad="10"></mt:SetVarBlock>
    <mt:SetVarBlock name="value">
        <tr>
            <th><mt:EntryDate format="%Y年%m月%d日"></th>
            <td><mt:EntryTitle></td>
        </tr>
    </mt:SetVarBlock>

    <mt:ignore>会計年度ごとの配列を作成します。</mt:ignore>
    <mt:SetVar name="$archive_year" key="$key" value="$value">

</mt:Entries>

<mt:ignore>会計年度を出力します。</mt:ignore>
<mt:Loop name="years" sort_by="key reverse">
    <section>
        <h2><mt:Var name="__key__">年3月期</h2>
        <table>
            <tbody>
            <mt:ignore>会計年度別の値を出力します。</mt:ignore>
            <mt:Var name="__key__" setvar="loop_entries">
            <mt:Loop name="$loop_entries" sort_by="key reverse">
                <mt:Var name="__value__">
            </mt:Loop>
            </tbody>
        </table>
    </section>
</mt:Loop>

解説

MTEntryDate タグで公開日を取得し「年」と「月日」部分をそれぞれ変数に格納します。

格納された値が「04」より多い場合は、「年」の値に1を足し、次会計年度で変数の上書きを行い、配列「years」に追加します。push対象をkeyとすることで、重複する値は登録されません。

<mt:Entries lastn="0">  
    <mt:ignore>04/01以降の記事は次会計年度として扱います。</mt:ignore>
    <mt:EntryDate format="%Y" setvar="archive_year">
    <mt:EntryDate format="%m" setvar="if_entrydate_md">
    <mt:if name="if_entrydate_md" ge="04">
        <mt:Var name="archive_year" op="+" value="1" setvar="archive_year">
    </mt:if>
    <mt:ignore>会計年度をに格納します。</mt:ignore>
    <mt:SetVar name="push(years)" key="$archive_year">
    ・・・省略・・・
</mt:Entries>

会計年度毎に表示したいコンテンツ部分をMTSetVarBlockタグ(value) で指定し、 コンテンツ順番をMTSetVarBlockタグ(key) で指定します。

順番は同日同時間で公開された場合に、keyが上書きされ記事が欠落しないように記事IDをzero_pad モディファイアで0で埋めて、10桁登録とします。(10桁もいらない気もするが)

<mt:Entries lastn="0">
    ・・・省略・・・
    <mt:ignore>コンテンツ部分</mt:ignore>
    <mt:SetVarBlock name="key"><mt:EntryDate format="%Y%m%d%H%M%S"><mt:EntryID zero_pad="10"></mt:SetVarBlock>
    <mt:SetVarBlock name="value">
        <tr>
            <th><mt:EntryDate format="%Y年%m月%d日"></th>
            <td><mt:EntryTitle></td>
        </tr>
    </mt:SetVarBlock>
    ・・・省略・・・
</mt:Entries>

ここがテンプレートの肝となる部分です。

SetVarタグのnameに、会計年度(変数archive_year)を指定し、 代入するkeyとvalue値に、上記で作成したコンテンツの変数keyと変数valueを指定します。

<mt:Entries lastn="0">
    ・・・省略・・・
    <mt:ignore>会計年度ごとの配列を作成します。</mt:ignore>
    <mt:SetVar name="$archive_year" key="$key" value="$value">

</mt:Entries>

これで、会計年度ごとの配列が完成しました。

最後に配列に格納した「会計年度」をMTLoop タグで実行し、配列に格納した「会計年度」の名前でMTLoop タグを実行すると、会計年度別にコンテンツが表示できます。

<mt:ignore>会計年度を出力します。</mt:ignore>
<mt:Loop name="years" sort_by="key reverse">
    <section>
        <h2><mt:Var name="__key__">年3月期</h2>
        <table>
            <tbody>
            <mt:ignore>会計年度別の値を出力します。</mt:ignore>
            <mt:Var name="__key__" setvar="loop_entries">
            <mt:Loop name="$loop_entries" sort_by="key reverse">
                <mt:Var name="__value__">
            </mt:Loop>
            </tbody>
        </table>
    </section>
</mt:Loop>

余談

前回も書きましたが、会計年度別の分類をMTEntryDateタグでなく、カスタムフィールドとした方が良いです。

mtevalモディファイアを使用する方法はこちらです。

記事一覧ページで会計年度別にmtevalモディファイアを使用して表示する方法