CMSのテーマ制作では、現在のカテゴリーだけでなく、親・最上層(先祖)のカテゴリー情報が必要となる場面が多くあります。
パンくずリスト(トピックパス)、コンテンツタイトルの表示、カテゴリーによる微妙なマークアップ変更などです。

Movable Typeのテンプレートで、このような情報を表示するために、都度、mt:EntryPrimaryCategorymt:ParentCategoryを使っている例をよく見かけますが、おすすめできません。
表示箇所が多いと再構築に無駄な時間がかかるようになりますし、テンプレートが冗長になってしまいます。

<mt:TemplateNote value="親カテゴリーへのリンクを表示" />
<mt:EntryPrimaryCategory><mt:ParentCategory><li><a href="<mt:ArchiveLink />"><mt:CategoryLabel encode_html="1" /></a></li></mt:ParentCategory></mt:EntryPrimaryCategory>

筆者はテンプレートの冒頭でカテゴリーの階層情報を変数に代入し、表示部分で使い回す方法を採用しています。ここでは大まかな手順と注意点を解説します。

基本構造のコードが間違っていたため、修正しました。

基本構造

現在・親・先祖カテゴリーの情報をまとめて取得するためのフォーマットは以下の通りです。先祖カテゴリーから順番に情報を取得するmt:ParentCategoriesと、mt:HasNoParentCategoryを利用します。

親カテゴリーの情報は、ループを繰り返すたびに上書きされていきます。exclude_currentモディファイアを1にしているため、最終的な情報は主カテゴリーのひとつ上、つまり親カテゴリーとなるのです。

<mt:EntryPrimaryCategory>

<mt:TemplateNote value="主カテゴリーに関する情報" />

  <mt:ParentCategories exclude_current="1">
    <mt:HasNoParentCategory>

      <mt:TemplateNote value="最上層カテゴリーに関する情報" />

    <mt:Else>

        <mt:TemplateNote value="親カテゴリーに関する情報" />

    </mt:HasNoParentCategory>
  </mt:ParentCategories>
</mt:EntryPrimaryCategory>

変数に代入する

mt:TemplateNoteでコメントが入っている箇所に、各カテゴリーの情報を取得するタグを追加していきます。表示名とリンク先URLであれば以下の通りです。

<mt:EntryPrimaryCategory>

<mt:TemplateNote value="主カテゴリーに関する情報" />
<mt:CategoryLabel setvar="archive_label" note="主カテゴリー名" />
<mt:ArchiveLink setvar="archive_url" note="主カテゴリーのURL" />

  <mt:ParentCategories exclude_current="1">
    <mt:HasNoParentCategory>

      <mt:TemplateNote value="最上層カテゴリーに関する情報" />
      <mt:CategoryLabel setvar="archive_ancestor_label" note="最上層カテゴリー名" />
      <mt:ArchiveLink setvar="archive_ancestor_url" note="最上層カテゴリーのURL" />

    <mt:Else>

      <mt:TemplateNote value="親カテゴリーに関する情報" />
      <mt:CategoryLabel setvar="archive_parent_label" note="親カテゴリー名" />
      <mt:ArchiveLink setvar="archive_parent_url" note="親カテゴリーのURL" />

      </mt:If>

    </mt:HasNoParentCategory>
  </mt:ParentCategories>
</mt:EntryPrimaryCategory>

表示部分で利用する

あとは表示したい箇所で、mt:Varを指定すれば情報を表示することができます。

最上層カテゴリー名: <mt:Var name="archive_ancestor_label" encode_html="1" /><br>
最上層カテゴリーのURL: <mt:Var name="archive_ancestor_url" /><br>
親カテゴリー名: <mt:Var name="archive_parent_label" encode_html="1" /><br>
親カテゴリーのURL: <mt:Var name="archive_parent_url" /><br>
主カテゴリー名: <mt:Var name="archive_label" encode_html="1" /><br>
主カテゴリーのURL: <mt:Var name="archive_url" />

冒頭の親カテゴリーへのリンクは以下の通りとなります。

<mt:TemplateNote value="親カテゴリーへのリンクを表示" />
<li><a href="<mt:Var name="archive_parent_url" />"><mt:Var name="archive_parent_label" encode_html="1" /></a></li>

「イベント情報」のカテゴリーのみマークアップを変更したい場合は、以下の通りです。ここでは解説の都合上、表示名を使っていますが、IDやベースネームが確実です。

<mt:If name="archive_parent_label" eq="イベント情報">
親カテゴリーがイベント情報です
<mt:Else>
親カテゴリーがイベント情報ではありません
</mt:If>

補足

表示名のエンコード

変数に代入するとき、表示名はエンコードしないようにします。これは、Movable Typeでは、表示名はmt:Entriesmt:SubCategoriesなどの絞り込み条件に使われることが多いためです。エンコードすると、カテゴリー名によっては値が変わってしまうことがあります。

ハッシュは使用しない

Movable Typeの変数の扱いに慣れていれば、「ハッシュ(配列)は使用しないのか?」「変数名が冗長ではないか?」と感じるかもしれません。
筆者は以下の理由から、ハッシュを利用していません。使用する場合は情報共有を確実にしてください。

  1. ダイナミック・パブリッシングを利用すると、ハッシュを処理できない
  2. ループ処理の場合は便利だが、中間層の情報をピンポイントで取得しにくい
  3. 他の制作者がテンプレートを見た場合に理解しにくい

子ブログ分割のすすめ

Movable Typeは、ウェブサイトを起点に子ブログを置くのが構築の基本です。このため、ブログ内のカテゴリーが3階層を超えるような構成は効率がよくありません。
最上層のカテゴリーでブログを分割することは可能か、構築段階から考慮しておきましょう。