📃

【Movable Type】カテゴリ一覧を出力する

2022/10/22に公開

概要

管理画面「カテゴリ」で追加されたカテゴリを出力する方法。カテゴリ一覧の出力方法はいくつかあり、用途により使い分けると便利。PowerCMSも同様。

なお、以降の説明においてカテゴリの階層は、とくに記載がなければ以下を前提としています。
また、使用できるモディファイアは、最低限覚えておくとよいもののみ記載しています。

カテゴリA
 └カテゴリA-1
 └カテゴリA-2
カテゴリB
 └カテゴリB-1
 └カテゴリB-2
カテゴリC
 └カテゴリC-1
 └カテゴリC-2

基本構造ととりあえず覚えておくといいモディファイア

カテゴリ一覧の出力方法はいくつかあります。

MTCategories

カテゴリの一覧を表示するためのブロック。カテゴリの階層は関係なく、すべて同列に出力される。表示順も固定(カテゴリ名を基準とした文字コード順の昇順)
何も考えず手っ取り早くカテゴリ一覧を表示させるにはオススメ。

<!-- MT記述 -->
<mt:Categories>
  <mt:If name="__first__">
    <ul>
  </mt:If>
    <li><a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a></li>
  <mt:If name="__last__">
    </ul>
  </mt:If>
</mt:Categories>

<!-- HTML出力 -->
<ul>
  <li><a href="">カテゴリA</a></li>
  <li><a href="">カテゴリA-1</a></li>
  <li><a href="">カテゴリA-2</a></li>
  <li><a href="">カテゴリB</a></li>
  <li><a href="">カテゴリB-1</a></li>
  <li><a href="">カテゴリB-2</a></li>
  <li><a href="">カテゴリC</a></li>
  <li><a href="">カテゴリC-1</a></li>
  <li><a href="">カテゴリC-2</a></li>
</ul>

show_empty

1を指定すると記事が公開されていないカテゴリも出力する。

MTTopLevelCategories

現在のカテゴリに関係なく、最上位のカテゴリ一覧を表示するブロック。アンカーメニューなど、単純に最上位のカテゴリリストのみ表示したい場合はこれが手っ取り早くてオススメ。

<!-- MT記述 -->
<mt:TopLevelCategories>
  <mt:SubCatIsFirst>
    <ul>
  </mt:SubCatIsFirst>
    <li><a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a></li>
  <mt:SubCatIsLast>
    </ul>
  </mt:SubCatIsLast>
</mt:TopLevelCategories>

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

リファレンスのページにはとくに記載がないが、以下のMTSubCategoriesのモディファイアであるsort_bysort_orderが使用できる。

MTSubCategories

現在のカテゴリの子カテゴリを階層化して一覧表示するブロック。上2つで紹介したものより細かい調整ができる。
最上位階層の出力にMTTopLevelCategoriesとあわせて使用することが多い。

<!-- MT記述 -->
<mt:TopLevelCategories>
  <h2><$mt:CategoryLabel$></h2>
  <mt:SubCategories>
    <mt:SubCatIsFirst>
      <ul>
    </mt:SubCatIsFirst>
        <li><a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a></li>
    <mt:SubCatIsLast>
      </ul>
    </mt:SubCatIsLast>
  </mt:SubCategories>
</mt:TopLevelCategories>

<!-- HTML出力 -->
<h2>カテゴリA</h2>
<ul>
  <li><a href="">カテゴリA-1</a></li>
  <li><a href="">カテゴリA-2</a></li>
</ul>
<h2>カテゴリB</h2>
<ul>
  <li><a href="">カテゴリB-1</a></li>
  <li><a href="">カテゴリB-2</a></li>
</ul>
<h2>カテゴリC</h2>
<ul>
  <li><a href="">カテゴリC-1</a></li>
  <li><a href="">カテゴリC-2</a></li>
</ul>

top

1を指定すると、MTTopLevelCategoriesと同じ挙動になる。
上記の例を書き換えると以下のようになるが、パッと見てわかりづらいため、最上位のカテゴリを出力したいのであれば、基本的にはMTTopLevelCategoriesを使うことをオススメします。

<mt:SubCategories top="1">
  <h2><$mt:CategoryLabel$></h2>
  <mt:SubCategories>
    <mt:SubCatIsFirst>
      <ul>
    </mt:SubCatIsFirst>
        <li><a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a></li>
    <mt:SubCatIsLast>
      </ul>
    </mt:SubCatIsLast>
  </mt:SubCategories>
</mt:SubCategories>

sort_order

昇順(ascend / デフォルトの指定)か降順(descend)を指定する。

category

特定のカテゴリの子カテゴリ一覧を表示したい場合に使用する。指定するのは「カテゴリ名」。
<MTEntries>のモディファイアとは違い、複数指定することはできない。

このモディファイアを使用する場合、出力時の挙動に注意。
たとえば「特定のカテゴリのみ出力で、親カテゴリを見出し・子カテゴリをリストとして表示」させたい場合、以下のような書き方をすると、意図した出力にならない。

<!-- 想定しているHTML内容 -->
<h2>カテゴリA</h2>
<ul>
  <li><a href="">カテゴリA-1</a></li>
  <li><a href="">カテゴリA-2</a></li>
</ul>

<!-- MT記述 -->
<mt:TopLevelCategories>
  <h3><$mt:CategoryLabel$></h3>
  <mt:SubCategories category="カテゴリA">
    <mt:SubCatIsFirst>
      <ul>
    </mt:SubCatIsFirst>
        <li><a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a></li>
    <mt:SubCatIsLast>
      </ul>
    </mt:SubCatIsLast>
  </mt:SubCategories>
</mt:TopLevelCategories>

<!-- 実際に出力されるHTML内容 -->
<h2>カテゴリA</h2>
<ul>
  <li><a href="">カテゴリA-1</a></li>
  <li><a href="">カテゴリA-2</a></li>
</ul>
<h2>カテゴリB</h2>
<ul>
  <li><a href="">カテゴリA-1</a></li>
  <li><a href="">カテゴリA-2</a></li>
</ul>
<h2>カテゴリC</h2>
<ul>
  <li><a href="">カテゴリA-1</a></li>
  <li><a href="">カテゴリA-2</a></li>
</ul>

これは以下の書き方で実装できる(違いは<h2>見出しの部分)

<mt:SubCategories category="カテゴリA">
  <mt:SubCatIsFirst>
    <mt:ParentCategory><h2><$mt:CategoryLabel$></h2></mt:ParentCategory>
    <ul>
  </mt:SubCatIsFirst>
      <li><a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a></li>
  <mt:SubCatIsLast>
    </ul>
  </mt:SubCatIsLast>
</mt:SubCategories>

あるいは

<mt:SubCategories category="カテゴリA">
  <mt:SubCatIsFirst>
    <mt:TopLevelParent><h2><$mt:CategoryLabel$></h2></mt:TopLevelParent>
    <ul>
  </mt:SubCatIsFirst>
      <li><a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a></li>
  <mt:SubCatIsLast>
    </ul>
  </mt:SubCatIsLast>
</mt:SubCategories>

MTSubCatsRecurse

MTSubCategoriesブロック内を再帰的に表示する。Markdown的にhtmlタグのみの単純な階層構造の出力の場合は、この書き方がシンプルでいいかもしれない。

<!-- カテゴリ例 -->
カテゴリA
 └カテゴリA-1
   └カテゴリA-1-1
   └カテゴリA-1-2
 └カテゴリA-2
   └カテゴリA-2-1
   └カテゴリA-2-2

<!-- MT記述 -->
<mt:TopLevelCategories>
  <h2><$mt:CategoryLabel$></h2>
  <mt:SubCategories>
    <mt:SubCatIsFirst>
      <ul>
    </mt:SubCatIsFirst>
        <li>
          <a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a>
          <$mt:SubCatsRecurse$>
        </li>
    <mt:SubCatIsLast>
      </ul>
    </mt:SubCatIsLast>
  </mt:SubCategories>
</mt:TopLevelCategories>

<!-- HTML出力 -->
<h2>カテゴリA</h2>
<ul>
  <li>
    <a href="">カテゴリA-1</a>
    <ul>
      <li><a href="">カテゴリA-1-1</a></li>
      <li><a href="">カテゴリA-1-2</a></li>
    </ul>
  </li>
  <li>
    <a href="">カテゴリA-2</a>
    <ul>
      <li><a href="">カテゴリA-2-1</a></li>
      <li><a href="">カテゴリA-2-2</a></li>
    </ul>
  </li>
</ul>

max_depth

再帰的に表示させる階層の数(深さ)を指定する。
1は直下の子カテゴリまで、2は孫カテゴリまでを出力する。

一緒に覚えておくといいMTタグ

カテゴリ一覧出力時に一緒に覚えておくといいMTタグたち。

MTCategoryLabel

カテゴリ名を出力する。

MTCategoryBasename

カテゴリのベースネームを出力する。主にCSSで指定するclass名に使用する場合が多い。

MTCategoryDescription

カテゴリ編集画面で入力した説明の内容を出力する。

カテゴリのアーカイブURL(カテゴリごとのページURL)を絶対URLで出力する。

MTCategoryID

カテゴリのID(数字)を出力する。

MTCategoryCount

カテゴリ毎に、そのカテゴリが指定されている公開されている記事の件数を出力する。単純に記事の件数を表示したり、MTIfブロックで記事が存在する場合、ない場合の分岐などに使える。

<!-- 記事が存在する場合にカテゴリ一覧へのリンクを貼る例 -->
<mt:If tag="CategoryCount">
  <li><a href="<$mt:CategoryArchiveLink$>"><$mt:CategoryLabel$></a></li>
<mt:Else>
  <li><$mt:CategoryLabel$></li>
</mt:If>

MTSubCatIsFirst

MTTopLevelCategories MTSubCategories内で使用する。ループ出力の一番はじめのときだけ実行されるブロックタグ。

MTSubCatIsLast

MTTopLevelCategories MTSubCategories内で使用する。ループ出力の一番最後のときだけ実行されるブロックタグ。

MTTopLevelParent

現在カテゴリの最上位の親カテゴリを表示するブロックタグ。上記の例を参照。

MTParentCategory

現在カテゴリの直上の親カテゴリを表示するブロックタグ。上記の例を参照。

公式リファレンス

すべて掲載しきれないので、大枠のもののみ記載しています。

MT

PowerCMS

Discussion