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

先日、MTQでの質問に対し、「ブログ記事内で特定のカテゴリラベル表示」という記事を書きました。
その続編で、1つの親カテゴリに対して複数の子カテゴリを指定している場合の出力方法を紹介します。

1.概要

先日の記事では、職業や学歴などの親カテゴリの下に、個々の職業や学歴のサブカテゴリがあって、サブカテゴリを1つずつ選択する場合に、親カテゴリごとにサブカテゴリを出力する話でした。
一方、今回は、1つの親カテゴリに対して、複数の子カテゴリを選択する場合です。

例えば、「趣味」という親カテゴリの下に「旅行」「映画」「スポーツ」といったサブカテゴリを作るとします。
そして、個々のブログ記事で、それらのサブカテゴリを複数選択するものとします。
ある記事では、趣味として「旅行」と「映画」のサブカテゴリをオンにする、といったことを行います。
この場合に、個々のブログ記事で、親カテゴリが「趣味」になっているサブカテゴリを出力する方法を考えます。

2.考え方

性質が同じデータを多数扱う時には、配列を使うと便利です。
今取り上げている例でも、「親カテゴリが『趣味』になっているサブカテゴリ」を複数扱います。
それらは同じ性質を持っているので、配列を使います。

今取り上げている例では、以下のように処理を行います。

  • 1.MTEntryCategoriesタグを使って、ブログ記事が属するカテゴリを順に読み込み、繰り返しを行います。
  • 2.親カテゴリが「趣味」になっているサブカテゴリの場合は、そのサブカテゴリ名を趣味用の配列に追加します。
  • 3.繰り返し終了後に、配列の個々の要素を順に出力します。

例えば、あるブログ記事で、「趣味」→「旅行」と「趣味」→「映画」のサブカテゴリを選択しているとします。
この場合、MTEntryCategoriesタグで、ブログ記事が属するカテゴリを順に読み込んでいって、「趣味」→「旅行」のカテゴリに当たった時には、趣味用の配列にカテゴリ名(旅行)を追加します。
この時点では、配列には「旅行」の要素だけが存在します。

さらに処理が進んで、「趣味」→「映画」のカテゴリに当たった時には、趣味用の配列にカテゴリ名(映画)を追加します。
この時点では、配列には「旅行」と「映画」の2つの要素が存在します。

そして、MTEntrySubCategoriesタグのブロックが終わったら、MTLoopタグを使って、配列の要素(旅行と映画)を順に出力します。

3.テンプレートの例

ブログ記事が属するカテゴリのうち、「趣味」カテゴリのサブカテゴリの名前を、「hobbies」という名前の配列に代入するものとします。
その処理は以下のようになります。

<$mt:SetVar name="hobbies" function="undef"$>
<mt:EntryCategories>
  <mt:IfIsDescendant parent="趣味">
    <$mt:CategoryLabel setvar="hobby"$>
    <$mt:SetVar name="hobbies" function="push" value="$hobby"$>
  </mt:IfIsDescendant>
</mt:EntryCategories>

1行目のMTSetVarタグは、配列hobbiesを空にすることを意味します(function="undef")。
2行目/7行目のMTEntryCategoriesタグで、ブログ記事が属するカテゴリを順に処理します。
次に、3行目/6行目のMTIfIsDescendantタグで、親カテゴリが「趣味」になっているカテゴリだけ4行目と5行目を処理するようにします。

4行目では、カテゴリ名(MTCategoryLabelタグ)を、いったん「hobby」という名前の変数に代入します。
そして、5行目のMTSetVarタグで、配列の最後に、変数hobbyの値(=4行目で代入したカテゴリ名)を追加します。
「function="push"」は、配列の最後に要素を追加することを意味します。

一方、上記の処理でできた配列から、個々の要素を順に出力するには、以下のような書き方をします。

<mt:Loop name="hobbies" glue=", ">
  <$mt:GetVar name="__value__"$>
</mt:Loop>

1行目/3行目のMTLoopタグで、配列から要素を順に取り出します。
「glue=", "」のモディファイアを指定していますので、要素の間がコンマで区切られます。
そして、2行目のMTGetVarタグで、配列の要素の値(__value__)を出力します。