ブログ記事内で特定のカテゴリラベル表示

MTQで「ブログ記事内で特定のカテゴリラベル表示」という質問があがっていました。
この質問にお答えします。

1.質問の概要

以下のような構造のカテゴリがあるとします。

├ 職業
| ├ 医者
| ├ 教師
| ├ ...(その他職業名)
|
├ 学歴
| ├ 大卒
| ├ 大学院卒
| ├ ...(その他学歴名)
|
├ 地域
  ├ 東京
  ├ 大阪
  ├ ...(その他地名)

また、個々のブログ記事は、職業/学歴/地域の中で、それぞれ1つずつカテゴリに属しています。
例えば、あるブログ記事は「医者」「大学院卒」「東京」のカテゴリに属し、また他のブログ記事は「教師」「大卒」「大阪」のカテゴリに属する、というような形です。

この状態で、それぞれのブログ記事が属するカテゴリを、職業/学歴/地域を別々に出力したいということです。
例えば、「医者」「大学院卒」「東京」のカテゴリに属するブログ記事の場合、「職業:医者、学歴:大学院卒、地域:東京」のように出力します。

2.親カテゴリを判断する

例えば、職業を出力したいとします。
この場合、ブログ記事が属するカテゴリの中で、親カテゴリが「職業」になっているカテゴリを探して、その情報を出力すれば良いです。

ブログ記事が属するカテゴリを順に出力するには、MTEntryCategoriesタグを使います。
また、「親カテゴリが○○」という条件判断は、MTIfIsDescendantタグ行うことができます。
MTParentCategoryタグのブロックの中で、MTIfIsDescendantタグで親カテゴリが「職業」「学歴」「地域」のどれになっているかを判断し、職業等を得ることができます。

なお、MTEntryCategoriesタグは、カテゴリの出力順序が不定です。
カテゴリの並び順の通りになるとは限りません。
例えば、上のカテゴリ構造で「医者」「大学院卒」「東京」のカテゴリを選択したとしても、出力はその通りの順序になるとは限らず、「東京」「大学院卒」「医者」のようになることもあり得ます。

そこで、MTEntryCategoriesタグのループの中でカテゴリ名を直接に出力しません。
いったん、職業/学歴/地域を変数に保存します。
そして、MTEntryCategoriesタグのループの後で、職業/学歴/地域の順に変数の値を出力します。

3.テンプレートの組み方

実際にテンプレートを組むと、以下のようになります。

<mt:EntryCategories>
  <mt:IfIsDescendant parent="職業">
    <$mt:CategoryLabel setvar="work"$>
  </mt:IfIsDescendant>
  <mt:IfIsDescendant parent="学歴">
    <$mt:CategoryLabel setvar="school"$>
  </mt:IfIsDescendant>
  <mt:IfIsDescendant parent="地域">
    <$mt:CategoryLabel setvar="area"$>
  </mt:IfIsDescendant>
</mt:EntryCategories>
<ul>
  <li>職業:<$mt:GetVar name="work"$></li>
  <li>学歴:<$mt:GetVar name="school"$></li>
  <li>地域:<$mt:GetVar name="area"$></li>
</ul>

1/11行目のMTEntryCategoriesタグで、ブログ記事が属するカテゴリを順に取り出し、繰り返しを行います。
2~4行目では、親カテゴリが「職業」の場合(2行目のMTIfIsDescendantタグ)、カテゴリ名を変数「work」に代入します(3行目のMTCategoryLabelタグ)。
同様に、5~7行目で学歴を変数schoolに代入し、8~10行目で地域を変数areaに代入します。
そして、12行目以降でwork/school/areaの順に各変数を出力し、職業/学歴/地域を表示します。

4.変数や条件判断は必須

Movable Type 5.1 Webサイト製作ガイドVolume 2この例のように、手の込んだ処理をしようとすると、変数や条件判断を避けて通ることができません。
拙著「Movable Type 5.1 Webサイト製作ガイドVolume 2」では、変数や条件判断について、かなり詳しく解説しています。
「変数や条件判断がよく分からない」という方は、ぜひ拙著をお読みください。