「WordPressで学ぶPHP(3)関数編」を発売しました。
本書は「WordPressで学ぶPHP(1)変数・制御構造編」「WordPressで学ぶPHP(2)データ構造(配列・オブジェクト)編」の続編にあたり、PHP組み込みの関数や、独自の関数を作る方法などを解説します。
Kindle本で、定価400円です。
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>