📃

【Movable Type】変数を利用して条件分岐する

2024/12/27に公開

概要

MT(PowerCMS含む、以下同)で変数を利用した条件分岐の方法、および関連する以下のモディファイアについて解説しています。

  • lt
  • gt
  • le
  • ge

条件分岐で利用するタグや上記以外のモディファイアを利用した基本的な書き方については、以下をご参考ください。

https://zenn.dev/srkkr/articles/7ef2cbd2c01fda

また、変数を定義する方法については、以下記事をご参考ください。

https://zenn.dev/srkkr/articles/67ad975f6ea076

基本の形

条件分岐に変数を利用する場合も、基本的な書き方は同じです。変数の場合はnameモディファイアを使用します。

<!-- 変数を定義する(MTSetVarBlockやsetvarモディファイアでもOK) -->
<mt:SetVar name="xxx" value="foo">

<!-- 条件分岐 -->
<mt:If name="xxx" eq="foo">
  <!-- 変数xxxの値がfooと一致する場合に表示する内容 -->
<mt:Else>
  <!-- 変数xxxの値がfooと一致しない場合に表示する内容 -->
</mt:If>

例:ページのカレント表示をする

以下の例では、カテゴリ一覧ページにおいて、カレント表示用のclass="current"を出力しています。
※この項目の例では、以下のカテゴリが設定されている想定です

  • カテゴリA ←このページにアクセス
  • カテゴリB
  • カテゴリC
<!-- MTML -->
<$mt:CategoryLabel setvar="current_cat"$>

<mt:TopLevelCategories>
  <mt:SubCatIsFirst>
    <ul>
  </mt:SubCatIsFirst>
    <li<mt:If tag="CategoryLabel" eq="$current_cat"> class="current"</mt:If>><a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a></li>
  <mt:SubCatIsLast>
    </ul>
  </mt:SubCatIsLast>
</mt:TopLevelCategories>

<!-- 出力結果 -->
<ul>
  <li class="current"><a href="">カテゴリA</a></li>
  <li><a href="">カテゴリB</a></li>
  <li><a href="">カテゴリC</a></li>
</ul>

記事リストタイプアーカイブのアーカイブマッピングが「カテゴリ」のテンプレートにおいて、MTCategoryLabelの値をsetvarモディファイアで変数current_catとして定義します。
カテゴリ一覧を出力するMTTopLevelCategoriesのループの中(liタグ)で条件分岐を行い、条件に一致するものに class="current"が追加で出力されます。
この場合の条件は「ループ中に出力されるカテゴリ名とカテゴリページのカテゴリ名を比較して、値が一致する場合」です。

例:記事一覧にNewマークを表示する

以下の例では、ページの再構築月と記事の更新月を比較して、同じ月であればNEWマークを表示しています。

<!-- MTML -->
<$mt:Date format="%Y%m" setvar="rebuildDate"$>

<mt:Entries lastn="10">
  <$mt:EntryDate format="%Y%m" setvar="newDate"$>
  <mt:EntriesHeader>
    <ul>
  </mt:EntriesHeader>
      <li>
        <a href="<$mt:EntryPermalink$>">
          <$mt:EntryDate format="%Y.%m.%d"$>  <$mt:EntryTitle$>
          <mt:If name="newDate" eq="$rebuildDate"> <span style="color: red;">NEW</span></mt:If>
        </a>
      </li>
  <mt:EntriesFooter>
    </ul>
  </mt:EntriesFooter>
</mt:Entries>

<!-- 出力結果 -->
<ul>
  <li><a href="">2024.12.18  2024年12月の記事 <span style="color: red;">NEW</span></a></li>
  <li><a href="">2024.11.17  2024年11月の記事</a></li>
  <li><a href="">2024.10.16  2024年10月の記事</a></li>
  <li><a href="">2024.09.15  2024年9月の記事</a></li>
  <li><a href="">2024.08.14  2024年8月の記事</a></li>  
</ul>

ページの再構築日を表示するMTDateタグに年月のフォーマットを付与し、値をsetvarモディファイアで変数rebuildDateとして定義します。また、MTEntriesのループの中で同じく年月のフォーマットを付与したMTEntryDateタグをsetvarモディファイアで変数newDateとして定義します。
記事一覧を出力するMTEntriesのループの中で条件分岐を行い、条件に一致する投稿記事に <span style="color: red;">NEW</span>が追加で出力されます。
この場合の条件は「記事の年月と再構築年月を比較して、値が一致する場合」です。

例:記事一覧で特定の日時以降の記事を表示する

MTEntriesMTPagesMTContentsといった記事一覧を出力するタグにおいて、いつからいつまでという期間を指定するモディファイアは存在しません。
daysというモディファイアがありますが、これは「n日以内」という指定のみ可能です)

ひとつ前のNEWマークの例もそうですが、記事一覧の出力の中で特定の期間の記事に対し何か処理をしたい場合は、指定した期間を値とした変数を定義し、条件分岐を利用します。

期間(日時)の値を数値として変数で定義し、数値同士の差分で条件を比較します。

<!-- 通常の日付出力として利用する(例:2024年12月25日) -->
<$mt:EntryDate format="%Y年%m月%d日"$>

<!-- 変数に格納して利用する(例:20241225) -->
<$mt:EntryDate format="%Y%m%d"$>

以下の例では、2024年9月以降の記事を表示しています。
※この項目の例では、以下の記事が公開されている想定です

  • 2024.12.18 2024年12月の記事
  • 2024.11.17 2024年11月の記事
  • 2024.10.16 2024年10月の記事
  • 2024.09.15 2024年9月の記事
  • 2024.08.14 2024年8月の記事
  • 2024.07.13 2024年7月の記事
  • 2024.06.12 2024年6月の記事
<!-- MTML -->
<mt:Entries lastn="20">
  <$mt:EntryDate format="%Y%m" setvar="date_period"$>
  <mt:EntriesHeader>
    <ul>
  </mt:EntriesHeader>
  <mt:If name="date_period" ge="202409">
      <li><a href="<$mt:EntryPermalink$>"><$mt:EntryDate format="%Y.%m.%d"$>  <$mt:EntryTitle$></a></li>
  </mt:If>
  <mt:EntriesFooter>
    </ul>
  </mt:EntriesFooter>
</mt:Entries>

<!-- 出力結果 -->
<ul>
  <li><a href="">2024.12.18  2024年12月の記事</a></li>
  <li><a href="">2024.11.17  2024年11月の記事</a></li>
  <li><a href="">2024.10.16  2024年10月の記事</a></li>
  <li><a href="">2024.09.15  2024年9月の記事</a></li>
</ul>

MTEntriesのループの中で年月のフォーマットを付与したMTEntryDateタグをsetvarモディファイアで変数date_periodとして定義します。
同じくMTEntriesのループの中で条件分岐を行い、条件に一致する投稿記事のみを出力しています。この場合の条件は「記事の年月と比較して、2024年9月以降の場合」です。

上記例では条件の値をge="202409"と直接数値指定していますが、比較する対象によってはMTDateなどの変数に格納した値を$付きで指定します。

数値の比較に使えるモディファイア

条件分岐に利用できるモディファイアのうち、eq like neは比較する値が文字列と数値どちらの場合にも利用できますが、以下に紹介するモディファイアは主に比較する値が数値の場合に利用します。

lt

指定した変数の値が条件よりも小さい場合に実行する。

以下、条件のlt="202409"に含まれる2024年9月の記事は出力されません。

<!-- MTML -->
<mt:Entries lastn="20">
  <$mt:EntryDate format="%Y%m" setvar="date_period"$>
  <mt:EntriesHeader>
    <ul>
  </mt:EntriesHeader>
  <mt:If name="date_period" lt="202409">
      <li><a href="<$mt:EntryPermalink$>"><$mt:EntryDate format="%Y.%m.%d"$>  <$mt:EntryTitle$></a></li>
  </mt:If>
  <mt:EntriesFooter>
    </ul>
  </mt:EntriesFooter>
</mt:Entries>

<!-- 出力結果 -->
<ul>
  <li><a href="">2024.08.14  2024年8月の記事</a></li>
  <li><a href="">2024.07.13  2024年7月の記事</a></li>
  <li><a href="">2024.06.12  2024年6月の記事</a></li>
</ul>

le

指定した変数の値が条件以下の場合に実行する。

以下、条件のle="202409"に含まれる2024年9月の記事も出力されます。

<!-- MTML -->
<mt:Entries lastn="20">
  <$mt:EntryDate format="%Y%m" setvar="date_period"$>
  <mt:EntriesHeader>
    <ul>
  </mt:EntriesHeader>
  <mt:If name="date_period" ge="202409">
      <li><a href="<$mt:EntryPermalink$>"><$mt:EntryDate format="%Y.%m.%d"$>  <$mt:EntryTitle$></a></li>
  </mt:If>
  <mt:EntriesFooter>
    </ul>
  </mt:EntriesFooter>
</mt:Entries>

<!-- 出力結果 -->
<ul>
  <li><a href="">2024.09.15  2024年9月の記事</a></li>
  <li><a href="">2024.08.14  2024年8月の記事</a></li>
  <li><a href="">2024.07.13  2024年7月の記事</a></li>
  <li><a href="">2024.06.12  2024年6月の記事</a></li>
</ul>

gt

指定した変数の値が条件よりも大きい場合に実行する。

以下、条件のgt="202409"に含まれる2024年9月の記事は出力されません。

<!-- MTML -->
<mt:Entries lastn="20">
  <$mt:EntryDate format="%Y%m" setvar="date_period"$>
  <mt:EntriesHeader>
    <ul>
  </mt:EntriesHeader>
  <mt:If name="date_period" gt="202409">
      <li><a href="<$mt:EntryPermalink$>"><$mt:EntryDate format="%Y.%m.%d"$>  <$mt:EntryTitle$></a></li>
  </mt:If>
  <mt:EntriesFooter>
    </ul>
  </mt:EntriesFooter>
</mt:Entries>

<!-- 出力結果 -->
<ul>
  <li><a href="">2024.12.18  2024年12月の記事</a></li>
  <li><a href="">2024.11.17  2024年11月の記事</a></li>
  <li><a href="">2024.10.16  2024年10月の記事</a></li>
</ul>

ge

指定した変数の値が条件以上の場合に実行する。

以下、条件のge="202409"に含まれる2024年9月の記事も出力されます。

<!-- MTML -->
<mt:Entries lastn="20">
  <$mt:EntryDate format="%Y%m" setvar="date_period"$>
  <mt:EntriesHeader>
    <ul>
  </mt:EntriesHeader>
  <mt:If name="date_period" ge="202409">
      <li><a href="<$mt:EntryPermalink$>"><$mt:EntryDate format="%Y.%m.%d"$>  <$mt:EntryTitle$></a></li>
  </mt:If>
  <mt:EntriesFooter>
    </ul>
  </mt:EntriesFooter>
</mt:Entries>

<!-- 出力結果 -->
<ul>
  <li><a href="">2024.12.18  2024年12月の記事</a></li>
  <li><a href="">2024.11.17  2024年11月の記事</a></li>
  <li><a href="">2024.10.16  2024年10月の記事</a></li>
  <li><a href="">2024.09.15  2024年9月の記事</a></li>
</ul>

yyyy年mm月〜yyy年mm月と期間を指定したい場合

「yyyy年mm月〜yyy年mm月の記事」という条件にする場合は、MTIf(またはMTUnless)を入れ子にして利用します。
以下の例では、2024年7月〜2024年10月の記事を出力しています。

<!-- MTML -->
<mt:Entries lastn="20">
  <$mt:EntryDate format="%Y%m" setvar="date_period"$>
  <mt:EntriesHeader>
    <ul>
  </mt:EntriesHeader>
  <mt:If name="date_period" ge="202407">
    <mt:If name="date_period" le="202410">
      <li><a href="<$mt:EntryPermalink$>"><$mt:EntryDate format="%Y.%m.%d"$>  <$mt:EntryTitle$></a></li>
    </mt:If>
  </mt:If>
  <mt:EntriesFooter>
    </ul>
  </mt:EntriesFooter>
</mt:Entries>

<!-- 出力結果 -->
<ul>
  <li><a href="">2024.10.16  2024年10月の記事</a></li>
  <li><a href="">2024.09.15  2024年9月の記事</a></li>
  <li><a href="">2024.08.14  2024年8月の記事</a></li>
  <li><a href="">2024.07.13  2024年7月の記事</a></li>
</ul>

これまでの例同様、MTEntriesのループの中で年月のフォーマットを付与したMTEntryDateタグをsetvarモディファイアで変数date_periodとして定義します。
同じくMTEntriesのループの中でまず条件ge="202407"(2024年7月以降)に一致する記事を抽出し、そこからさらに条件le="202410"(2024年10月以前)に一致する記事を抽出して処理しています。

MTの条件分岐はlikeを例外として一度に複数の条件を指定できないため、「ある一定の期間内」を抽出したい場合は、このように条件分岐タグを入れ子にして書きます。

期間指定をする際の留意事項

MTEntriesMTPagesMTContentsといった記事一覧を出力するループの中において、lastnlimitモディファイアの値が大きい(あるいは0で全件指定)と、いったんまずその指定件数分の記事を抽出した上で次に条件分岐の処理が行われるため、再構築などの処理に負荷や時間がかかってしまいます。
ループ内で条件分岐を行う場合は、可能であれば最初の記事の出力件数をある程度の数で指定しておくと良いかと思います。

例:コンテンツタイプのラジオボタンやセレクトボックスで条件分岐する

条件分岐でよく使うもののひとつに、「ラジオボタンの値によって表示(処理)を変える」というものがあります。

記事やウェブページで利用するカスタムフィールドのラジオボタン(ドロップダウンも同様)の場合は、以下の形で条件分岐が可能です(テンプレートタグはcf_xxxとしています)

<!-- カスタムフィールドのラジオボタン(ドロップダウン)の条件分岐 -->

<!-- カスタムフィールドの設定が保存値=表示値の場合 -->
<mt:If tag="cf_xxx" eq="保存値">
  <!-- 条件が一致する場合の内容 -->
<mt:Else>
  <!-- 条件が一致しない場合の内容 -->
</mt:If>

<!-- カスタムフィールドの設定が表示値のみの場合 -->
<mt:If tag="cf_xxx" eq="表示値">
  <!-- 条件が一致する場合の内容 -->
<mt:Else>
  <!-- 条件が一致しない場合の内容 -->
</mt:If>

コンテンツタイプのラジオボタン(セレクトボックスも同様)でも同じ書き方ができると思いきや、この書き方ではMTElseの内容が表示されてしまいます。

<!-- コンテンツタイプのラジオボタン(セレクトボックス)ではmt:Elseの内容になる -->

<!-- 名前ではダメ -->
<mt:If tag="ContentField" content_field="ラジオボタン" eq="名前">
  <mt:ContentField content_field="ラジオボタン">
    <mt:ContentFieldValue>
  </mt:ContentField>
<mt:Else>
  ここに書かれた内容が表示(処理)される
</mt:If>

<!-- 値でもダメ -->
<mt:If tag="ContentField" content_field="ラジオボタン" eq="">
  <mt:ContentField content_field="ラジオボタン">
    <mt:ContentFieldValue>
  </mt:ContentField>
<mt:Else>
  ここに書かれた内容が表示(処理)される
</mt:If>

コンテンツタイプにおけるラジオボタン(あるいはセレクトボックス)の値での条件分岐は、値をいったん変数に格納し、その変数を利用することで可能です。

※この項目の例では、ラジオボタンの値(名前(key)値(value))を以下のように設定しています

  • ラジオボタン1:radio1 ←これにチェック
  • ラジオボタン2:radio2
  • ラジオボタン3:radio3
<!-- 値を変数に定義する -->
<mt:SetVarBlock name="ct_radio"><mt:ContentField content_field="ラジオボタン"><mt:ContentFieldValue></mt:ContentField></mt:SetVarBlock>

<!-- MTML -->
<mt:If name="ct_radio" eq="radio1">
  <mt:ContentField content_field="ラジオボタン">
    <mt:Var name="__key__">
  </mt:ContentField>
<mt:Else>
  <!-- 変数ct_radioの値がradio1に一致しない場合の処理 -->
</mt:If>

<!-- 出力結果 -->
ラジオボタン1

MTSetVarBlockを利用して変数を定義する場合、改行により変数の値が正常に入らないため、1行で書いています(値の前に余分な空白が入ってしまう)
整形したコードは以下です。

<!-- 値を変数に定義する(整形ver) -->
<mt:SetVarBlock name="ct_radio">
  <mt:ContentField content_field="ラジオボタン">
    <mt:ContentFieldValue>
  </mt:ContentField>
</mt:SetVarBlock>

なお、上記変数を定義するコードの中で、<mt:ContentFieldValue><mt:Var name="__key__">にすると、名前(key)を値として定義することも可能です。
その場合、MTIfの条件指定(今回はeq)の値も名前(key)になります。

チェックボックスの値での条件分岐について

コンテンツタイプのチェックボックスの値で条件分岐する場合も、ラジオボタンと同様に変数に値を格納して利用します。
ただし、コンテンツタイプのチェックボックスは複数指定が可能なため、MTIfMTUnlessの条件指定をeqneとすると、複数チェックが入っている場合はMTElseの内容が出力(処理)されます。
チェックボックスの値を分岐条件に使用する場合は、likeを利用するとよいです。

公式リファレンス

MT

PowerCMS

Discussion