MTIfIsDescendant/MTIfIsAncestorタグの落とし穴

当ブログへの質問に対して動作を調べていたときに、MTIfIsDescendant/MTIfIsAncestorタグに落とし穴があることに気づきました。

MTIfIsDescendantタグの落とし穴

公式なドキュメントによると、MTIfIsDescendantタグの動作は、以下のように解説されています。

現在のカテゴリが、parentモディファイアで指定したカテゴリのサブカテゴリにあたるか判定する条件タグです。

ところが、動作を確かめてみると、「現在のカテゴリが、parentモディファイアで指定したカテゴリのサブカテゴリにあたる」ときだけでなく、「現在のカテゴリが、parentモディファイアで指定したカテゴリそのものである」ときにも、MTIfIsDescendantタグのブロック内が処理されます。

例えば、カテゴリの構造が以下のようになっているとします。

├ 親1
│ ├ 子1-1
│ ├ 子1-2
│ └ 子1-3
└ 親2
  ├ 子2-1
  ├ 子2-2
  └ 子2-3

また、この状態で、以下のテンプレートを処理するとします。

<mt:IfIsDescendant parent="親1">
  ・・・
</mt:IfIsDescendant>

公式ドキュメント通りの動作だと、現在処理中のカテゴリが「子1-1」「子1-2」「子1-3」の時に、MTIfIsDescendantタグのブロック内が処理されることになります。
しかし実際には、現在処理中のカテゴリが「子1-1」「子1-2」「子1-3」の時だけでなく、「親1」カテゴリの時にも、MTIfIsDescendantタグのブロック内が処理されます。

自分自身を除外する

上記の状況で、「親1」カテゴリを除外して、「子1-1」「子1-2」「子1-3」カテゴリの時だけ処理を行いたい場合、MTIfタグを使って、現在のカテゴリが親1カテゴリでないときに処理を行うようにします。
具体的には、テンプレートを以下のように組みます。

<mt:IfIsDescendant parent="親1">
  <mt:If tag="CategoryLabel" ne="親1">
    ・・・
  </mt:If>
</mt:IfIsDescendant>