📃

【Movable Type】カテゴリ出力に関するあれそれ

2025/02/18に公開

概要

MT(PowerCMS含む、以下同)において、記事一覧やカテゴリ一覧、記事ページなどでカテゴリを出力する際に使えるMTタグについて解説しています。

本記事の例では、カテゴリを以下の階層にしています(括弧内はベースネーム)

カテゴリA(catA)
└カテゴリA-1(catA-1)
 └カテゴリA-1-1(catA-1-1)
カテゴリB(catB)
└カテゴリB-1(catB-1)
 └カテゴリB-1-1(catB-1-1)
カテゴリC(catC)
└カテゴリC-1(catC-1)
 └カテゴリC-1-1(catC-1-1)
カテゴリD(catD)

なお、カテゴリ一覧を出力する方法については、以下記事をご参考ください。

https://zenn.dev/srkkr/articles/3a1146f3e9a96f

記事に指定したカテゴリをすべて出力する

記事に指定したカテゴリをすべて出力(処理)するには、MTEntryCategoriesを利用します。

<!-- MTML -->
<mt:EntryCategories glue="<br>">
  <a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a>
</mt:EntryCategories>

<!-- 出力結果 -->
<a href="カテゴリアーカイブページURL">カテゴリA</a><br>
<a href="カテゴリアーカイブページURL">カテゴリB-1</a><br>
<a href="カテゴリアーカイブページURL">カテゴリC-1-1</a>

glueモディファイアの値に区切り文字を指定できます。上記例のように、値にHTMLタグを指定することも可能です。

記事に指定したカテゴリのうち、プライマリ(メイン)カテゴリを出力する

記事に指定したカテゴリのうち、プライマリ(メイン)カテゴリのみを出力(処理)する場合は、MTEntryPrimaryCategoryを利用します。
プライマリ(メイン)カテゴリは、記事作成・編集画面でカテゴリを選択した際に太字で表示されるカテゴリです。

以下の例では、記事に次のカテゴリを設定しています。

  • カテゴリA(プライマリカテゴリ)
  • カテゴリB-1
  • カテゴリC
<!-- MTML -->
<mt:EntryPrimaryCategory>
  <a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a>
</mt:EntryPrimaryCategory>

<!-- 出力結果 -->
<a href="カテゴリアーカイブページURL">カテゴリA</a>

なお、MTEntryCategoriestype="primary"モディファイアを指定した場合も、同様の出力結果が得られます。

<mt:EntryCategories type="primary">
  <a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a>
</mt:EntryCategories>

どちらの記述をするかは好みによりますが、筆者としてはMTEntryPrimaryCategoryのほうがパッと見た目でわかりやすいかと思います。

記事に指定したカテゴリのうち、プライマリ(メイン)以外のカテゴリを出力する

記事に指定したカテゴリのうち、プライマリ(メイン)以外のカテゴリを出力(処理)する場合は、MTEntryAdditionalCategoriesを利用します。

以下の例では、記事に次のカテゴリを設定しています。

  • カテゴリA(プライマリカテゴリ)
  • カテゴリB-1
  • カテゴリC
<!-- MTML -->
<mt:EntryAdditionalCategories glue="<br>">
  <a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a>
</mt:EntryAdditionalCategories>

<!-- 出力結果 -->
<a href="カテゴリアーカイブページURL">カテゴリB-1</a><br>
<a href="カテゴリアーカイブページURL">カテゴリC</a>

glueモディファイアの値に区切り文字を指定できます。上記例のように、値にHTMLタグを指定することも可能です。

指定したカテゴリの所属の有無で条件分岐する

指定したカテゴリが、記事一覧やカテゴリ一覧の出力時や、記事ページにおいて記事がそのカテゴリに属しているかどうかで処理を分ける場合は、MTIfCategoryを利用します。

以下の例では、最上位のカテゴリ一覧を出力する際、「カテゴリA」にのみ別途class名を振っています。

<!-- MTML -->
<mt:TopLevelCategories>
  <mt:SubCatIsFirst>
    <ul>
  </mt:SubCatIsFirst>
    <li class="<$mt:CategoryBasename$><mt:IfCategory label='カテゴリA'> has-first</mt:IfCategory>"><a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a></li>
  <mt:SubCatIsLast>
    </ul>
  </mt:SubCatIsLast>
</mt:TopLevelCategories>

<!-- 出力結果 -->
<ul>
  <li class="catA has-first"><a href="カテゴリアーカイブページURL">カテゴリA</a></li>
  <li class="catB"><a href="カテゴリアーカイブページURL">カテゴリB</a></li>
  <li class="catC"><a href="カテゴリアーカイブページURL">カテゴリC</a></li>
  <li class="catD"><a href="カテゴリアーカイブページURL">カテゴリD</a></li>
</ul>

カテゴリの指定は、label(またはname)モディファイアに値を「カテゴリ名」で指定します。
なお、MTIfCategory内でMTElseの利用が可能です。

<mt:IfCategory label="カテゴリA">
  <!-- カテゴリAの処理 -->
<mt:Else>
  <!-- カテゴリA以外での処理 -->
</mt:IfCategory>

カテゴリの親カテゴリを出力する

カテゴリの親カテゴリを出力(処理)する場合は、MTParentCategoryを利用します。

以下の例では、記事に次のカテゴリを設定しています。

  • カテゴリA-1-1
<!-- MTML -->
<mt:ParentCategory>
  <a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a>
</mt:ParentCategory>

<!-- 出力結果 -->
<a href="カテゴリアーカイブページURL">カテゴリA-1</a>

複数指定した下層カテゴリの親カテゴリを出力する場合は、MTEntryCategoriesを併用します。
以下の例では、記事に次のカテゴリを設定しています。

  • カテゴリA-1
  • カテゴリB-1
<!-- MTML -->
<mt:EntryCategories glue="<br>">
  <mt:ParentCategory>
      <a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a>
  </mt:ParentCategory>
</mt:EntryCategories>

<!-- 出力結果 -->
<a href="カテゴリアーカイブページURL">カテゴリA</a><br>
<a href="カテゴリアーカイブページURL">カテゴリB</a>

指定したカテゴリが第3階層以下の場合、最上位のカテゴリを出力するには、階層分のMTParentCategoryを記述することで出力可能です。
以下の例では、記事に次のカテゴリを設定しています。

  • カテゴリA-1-1
<!-- MTML -->
<mt:ParentCategory>
  <mt:ParentCategory>
    <a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a>
  </mt:ParentCategory>
</mt:ParentCategory>

<!-- 出力結果 -->
<a href="カテゴリアーカイブページURL">カテゴリA</a>

親カテゴリの存在有無で条件分岐する

カテゴリに親カテゴリが存在するかどうかで出力(処理)を分ける場合は、MTHasParentCategoryまたはMTHasNoParentCategoryを利用します。

以下の例では、記事に設定されたカテゴリに親カテゴリが存在している場合は親カテゴリと設定されたカテゴリを、親カテゴリが存在していなければ設定されたカテゴリのみを出力しています。

<!-- MTML -->
<mt:HasParentCategory>
  <mt:ParentCategory>
    <a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a><br>
  </mt:ParentCategory>
    <a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a>
<mt:Else>
  <a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a>
</mt:HasParentCategory>

上記は以下のように記述することもできます。出力結果は同じです。

<!-- MTML -->
<mt:HasNoParentCategory>
  <a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a>
<mt:Else>
  <mt:ParentCategory>
    <a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a><br>
  </mt:ParentCategory>
    <a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a>
</mt:HasNoParentCategory>

MTHasParentCategoryまたはMTHasNoParentCategoryタグ内ではMTElseが利用できます。

どちらを使うかは場合によりますが、以下のような状況で使い分けると、テンプレートの可読性や探しやすさ的にもよいかなと思います。

  • 親−子カテゴリが多い:MTHasParentCategory
  • 親−子カテゴリが少ない:MTHasNoParentCategory

サブカテゴリの存在有無で条件分岐する

カテゴリにサブカテゴリが存在するかどうかで出力(処理)を分ける場合は、MTHasSubCategoriesまたはMTHasNoSubCategoriesを利用します。

以下の例では、最上位のカテゴリ一覧を出力する際、サブカテゴリが存在するカテゴリに別途class名を振っています。

<!-- MTML -->
<mt:TopLevelCategories>
  <mt:SubCatIsFirst>
    <ul>
  </mt:SubCatIsFirst>
    <li class="<$mt:CategoryBasename$><mt:HasSubCategories> has-sub</mt:HasSubCategories>"><a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a></li>
  <mt:SubCatIsLast>
    </ul>
  </mt:SubCatIsLast>
</mt:TopLevelCategories>

<!-- 出力結果 -->
<ul>
  <li class="catA has-sub"><a href="カテゴリアーカイブページURL">カテゴリA</a></li>
  <li class="catB has-sub"><a href="カテゴリアーカイブページURL">カテゴリB</a></li>
  <li class="catC has-sub"><a href="カテゴリアーカイブページURL">カテゴリC</a></li>
  <li class="catD"><a href="カテゴリアーカイブページURL">カテゴリD</a></li>
</ul>

また、以下はサブカテゴリが存在しないカテゴリに別途class名を振っています。

<!-- MTML -->
<mt:TopLevelCategories>
  <mt:SubCatIsFirst>
    <ul>
  </mt:SubCatIsFirst>
    <li class="<$mt:CategoryBasename$><mt:HasNoSubCategories> no-sub</mt:HasNoSubCategories>"><a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a></li>
  <mt:SubCatIsLast>
    </ul>
  </mt:SubCatIsLast>
</mt:TopLevelCategories>

<!-- 出力結果 -->
<ul>
  <li class="catA"><a href="カテゴリアーカイブページURL">カテゴリA</a></li>
  <li class="catB"><a href="カテゴリアーカイブページURL">カテゴリB</a></li>
  <li class="catC"><a href="カテゴリアーカイブページURL">カテゴリC</a></li>
  <li class="catD no-sub"><a href="カテゴリアーカイブページURL">カテゴリD</a></li>
</ul>

MTHasSubCategoriesまたはMTHasNoSubCategoriesタグ内ではMTElseが利用できます。

最上位カテゴリから現在のカテゴリまでを再帰的に出力する

最上位〜現在のカテゴリまでを再帰的に出力(処理)したい場合は、MTParentCategoriesを利用できます。
以下の例では、記事に次のカテゴリを設定しています。

  • カテゴリA-1-1
<!-- MTML -->
<ul>
  <mt:ParentCategories>
    <li class="<$mt:CategoryBasename$>"><a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a></li>
  </mt:ParentCategories>
</ul>

<!-- 出力結果 -->
<ul>
  <li class="catA"><a href="カテゴリアーカイブページURL">カテゴリA</a></li>
  <li class="catA-1"><a href="カテゴリアーカイブページURL">カテゴリA-1</a></li>
  <li class="catA-1-1"><a href="カテゴリアーカイブページURL">カテゴリA-1-1</a></li>
</ul>

MTParentCategoriesの中身が繰り返して処理されます。
glueモディファイアを利用でき、値に区切り文字を指定できます。値にHTMLタグを指定することも可能です。
また、exclude_current="1"を指定すると、現在のカテゴリを除外して出力します。

コンテンツタイプでの出力の場合

コンテンツタイプで利用するカテゴリセットで出力(処理)する場合も、おおむねは上記の記述で可能です。
以下、それぞれの出力についてまとめています。

記事に指定したカテゴリをすべて出力する

コンテンツタイプの場合は、以下の記述で記事に指定したカテゴリをすべて出力(処理)します。

<mt:ContentField content_field="カテゴリ">
  <a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a>
</mt:ContentField>

MTContentFieldタグも、MTEntryCategories同様にglueモディファイアの値に区切り文字を指定できます。値にHTMLタグを指定することも可能です。

記事に指定したカテゴリのうち、プライマリ(メイン)カテゴリを出力する

コンテンツタイプにはプライマリカテゴリを出力するためのMTタグがないため、MTIfの予約変数を利用します。
MTではプライマリ(メイン)カテゴリは、記事作成・編集画面でカテゴリを選択した際に太字で先頭に表示されるので、この仕様を利用しています。

<mt:ContentField content_field="カテゴリ">
  <mt:If name="__first__">
    <a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a>
  </mt:If>
</mt:ContentField>

記事に指定したカテゴリのうち、プライマリ(メイン)以外のカテゴリを出力する

上記同様にコンテンツタイプにはプライマリカテゴリ以外を出力するためのMTタグがないため、MTUnlessの予約変数を利用します。

<mt:ContentField content_field="カテゴリ">
  <mt:Unless name="__first__">
    <a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a>
  </mt:Unless>
</mt:ContentField>

指定したカテゴリの所属の有無で条件分岐する

記事のカテゴリと同じように利用できます。

<mt:TopLevelCategories>
  <mt:SubCatIsFirst>
    <ul>
  </mt:SubCatIsFirst>
    <li class="<$mt:CategoryBasename$><mt:IfCategory label='カテゴリA'> has-first</mt:IfCategory>"><a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a></li>
  <mt:SubCatIsLast>
    </ul>
  </mt:SubCatIsLast>
</mt:TopLevelCategories>

カテゴリの親カテゴリを出力する

記事のカテゴリと同じように利用できます。

<mt:ContentField content_field="カテゴリ">
  <mt:ParentCategory>
    <a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a>
  </mt:ParentCategory>
</mt:ContentField>

指定したカテゴリが第3階層以下の場合、最上位のカテゴリを出力するには、階層分のMTParentCategoryを記述することで出力可能です。

<mt:ContentField content_field="カテゴリ">
  <mt:ParentCategory>
    <mt:ParentCategory>
      <a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a>
    </mt:ParentCategory>
  </mt:ParentCategory>
</mt:ContentField>

親カテゴリの存在有無で条件分岐する

記事のカテゴリと同じように利用できます。
以下はいずれも出力結果は同じです。

<!-- MTHasParentCategory -->
<mt:ContentField content_field="カテゴリ">
  <mt:HasParentCategory>
    <mt:ParentCategory>
      <a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a><br>
    </mt:ParentCategory>
      <a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a>
  <mt:Else>
    <a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a>
  </mt:HasParentCategory>
</mt:ContentField>
<!-- MTHasNoParentCategory -->
<mt:ContentField content_field="カテゴリ">
  <mt:HasNoParentCategory>
    <a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a>
  <mt:Else>
    <mt:ParentCategory>
      <a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a><br>
    </mt:ParentCategory>
      <a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a>
  </mt:HasNoParentCategory>
</mt:ContentField>

サブカテゴリの存在有無で条件分岐する

記事のカテゴリと同じように利用できます。

<!-- MTHasSubCategories -->
<mt:TopLevelCategories>
  <mt:SubCatIsFirst>
    <ul>
  </mt:SubCatIsFirst>
    <li class="<$mt:CategoryBasename$><mt:HasSubCategories> has-sub</mt:HasSubCategories>"><a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a></li>
  <mt:SubCatIsLast>
    </ul>
  </mt:SubCatIsLast>
</mt:TopLevelCategories>
<!-- MTHasNoSubCategories -->
<mt:TopLevelCategories>
  <mt:SubCatIsFirst>
    <ul>
  </mt:SubCatIsFirst>
    <li class="<$mt:CategoryBasename$><mt:HasNoSubCategories> no-sub</mt:HasNoSubCategories>"><a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a></li>
  <mt:SubCatIsLast>
    </ul>
  </mt:SubCatIsLast>
</mt:TopLevelCategories>

最上位カテゴリから現在のカテゴリまでを再帰的に出力する

記事のカテゴリと同じように利用できます。

<ul>
  <mt:ContentField content_field="カテゴリ">
    <mt:ParentCategories>
      <li class="<$mt:CategoryBasename$>"><a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a></li>
    </mt:ParentCategories>
  </mt:ContentField>
</ul>

公式リファレンス

MT

PowerCMS

Discussion