【Movable Type】カテゴリ出力に関するあれそれ
概要
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)
なお、カテゴリ一覧を出力する方法については、以下記事をご参考ください。
記事に指定したカテゴリをすべて出力する
記事に指定したカテゴリをすべて出力(処理)するには、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>
なお、MTEntryCategories
にtype="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
- https://www.movabletype.jp/documentation/appendices/tags/entrycategories.html
- https://www.movabletype.jp/documentation/appendices/tags/entryprimarycategory.html
- https://www.movabletype.jp/documentation/appendices/tags/entryadditionalcategories.html
- https://www.movabletype.jp/documentation/appendices/tags/ifcategory.html
- https://www.movabletype.jp/documentation/appendices/tags/parentcategory.html
- https://www.movabletype.jp/documentation/appendices/tags/hasparentcategory.html
- https://www.movabletype.jp/documentation/appendices/tags/hasnoparentcategory.html
- https://www.movabletype.jp/documentation/appendices/tags/hassubcategories.html
- https://www.movabletype.jp/documentation/appendices/tags/hasnosubcategories.html
- https://www.movabletype.jp/documentation/appendices/tags/parentcategories.html
PowerCMS
- https://www.powercms.jp/products/document/template-tags/entrycategories.html
- https://www.powercms.jp/products/document/template-tags/entryprimarycategory.html
- https://www.powercms.jp/products/document/template-tags/entryadditionalcategories.html
- https://www.powercms.jp/products/document/template-tags/ifcategory.html
- https://www.powercms.jp/products/document/template-tags/parentcategory.html
- https://www.powercms.jp/products/document/template-tags/hasparentcategory.html
- https://www.powercms.jp/products/document/template-tags/hasnoparentcategory.html
- https://www.powercms.jp/products/document/template-tags/hassubcategories.html
- https://www.powercms.jp/products/document/template-tags/hasnosubcategories.html
- https://www.powercms.jp/products/document/template-tags/parentcategories.html
Discussion