Movable TypeのMTEntryIfCategoryタグとMTIfCategoryタグの違いについて調べてみました。これはMTQにあがっていた質問の回答です。
1.MTIfCategoryタグ
公式サイトのMTIfCategoryタグの説明は次のようになっています。
コンテキスト内に指定されたカテゴリが含まれる、またはアクティブなブログ記事が指定されたカテゴリに属している場合に有効になる条件タグです。
2.MTEntryIfCategoryタグ
公式サイトのMTEntryIfCategoryタグの説明は次のようになっています。
コンテキスト内に指定されたカテゴリが含まれる、またはアクティブなブログ記事が指定されたカテゴリに属している場合に有効になる条件タグです。MTIfCategoryブロックタグと異なる点は、コンテキスト内のブログ記事に対してのみ適用する点です。
公式サイトに記載はありませんが、ソースコード上、このタグは非推奨になっています。
3.MTIfCategoryタグとMTEntryIfCategoryタグの違い
1項と2項の説明はおいといて(笑)、概ねつぎのような違いがあるようです。
- MTIfCategoryタグ:カテゴリまたはブログ記事コンテキストで利用可能
- MTEntryIfCategoryタグ:ブログ記事コンテキストでのみ利用可能
以下、サンプルです。
MTIfCategoryタグは、カテゴリコンテキストとなるテンプレートで利用できます。
<mt:TopLevelCategories>
<$mt:CategoryLabel$>
<mt:IfCategory name="foo">
(fooカテゴリの処理を記述)
</mt:IfCategory>
<$mt:SubCatsRecurse$>
</mt:TopLevelCategories>
あるいは、ブログ記事コンテキストとなるテンプレートでも利用できます。
<mt:Entries>
<mt:EntryTitle>
<mt:IfCategory name="foo">
このブログ記事はfooに属しています
</mt:IfCategory>
</mt:Entries>
カテゴリアーカイブ・ブログ記事アーカイブ内で次のように記述することもできます。
<mt:IfCategory name="foo">
(fooカテゴリの処理を記述)
</mt:IfCategory>
一方、MTEntryIfCategoryタグは、MTEntriesタグなど、ブログ記事コンテキストとなるテンプレートでのみ利用できます。
<mt:Entries>
<$mt:EntryTitle$>
<mt:EntryIfCategory name="foo">
このブログ記事はfooに属しています
</mt:EntryIfCategory>
</mt:Entries>
またはブログ記事アーカイブ内で次のように記述します。
<mt:EntryIfCategory name="foo">
このブログ記事はfooに属しています
</mt:EntryIfCategory>
4.コンテキストを入れ子にしたときの動作
3項の説明で、ブログ記事コンテキストではMTIfCategoryタグ・MTEntryIfCategoryタグのどちらを使っても同じ動作になるようですが、以下のサンプルでは動作に違いがありました。
あるブログ記事「test」が、次のように2つのカテゴリ「foo」「bar」に属していると仮定します。プライマリカテゴリは「foo」です。
このような状態で次のようにカテゴリコンテキストとブログ記事コンテキストが入れ子になったテンプレートでMTIfCategoryタグ使うと、ブログ記事「test」の処理では、「このブログ記事はfooに属しています。」のみが表示されます。
<mt:TopLevelCategories>
<mt:CategoryLabel>
<mt:Entries>
<mt:EntryTitle>
<mt:IfCategory name="foo">
このブログ記事はfooに属しています。
</mt:IfCategory>
<mt:IfCategory name="bar">
このブログ記事はbarに属しています。
</mt:IfCategory>
</mt:Entries>
<$mt:SubCatsRecurse$>
</mt:TopLevelCategories>
ところが、MTEntryIfCategoryタグを使うと、「このブログ記事はfooに属しています。」と「このブログ記事はbarに属しています。」の両方、つまりブログ記事が属しているすべてのカテゴリが対象になります。
<mt:TopLevelCategories>
<mt:CategoryLabel>
<mt:Entries>
<mt:EntryTitle>
<mt:EntryIfCategory name="foo">
このブログ記事はfooに属しています。
</mt:EntryIfCategory>
<mt:EntryIfCategory name="bar">
このブログ記事はbarに属しています。
</mt:EntryIfCategory>
</mt:Entries>
<$mt:SubCatsRecurse$>
</mt:TopLevelCategories>
カテゴリコンテキストでMTIfCategoryタグの場合:プライマリカテゴリを対象
上記以外の場合:全カテゴリを対象
これは内部の実装でこのような処理になっているようです(間違っていたらすいません)。
5.typeモディファイア指定
どちらのテンプレートも「type="primary"(指定したカテゴリがプライマリの場合)」または「type="secondary"(指定したカテゴリがプライマリ以外の場合)」を指定できます。
<mt:TopLevelCategories>
<mt:CategoryLabel>
<mt:Entries>
<mt:EntryTitle>
<mt:IfCategory name="foo" type="primary">
このブログ記事はfooに属しています。
</mt:IfCategory>
<mt:IfCategory name="bar" type="primary">
このブログ記事はbarに属しています。
</mt:IfCategory>
</mt:Entries>
<$mt:SubCatsRecurse$>
</mt:TopLevelCategories>
このモディファイアを適用した場合は、どちらのテンプレートタグも同じ動作になるようです。
6.MTEntriesタグのcategory/categoriesモディファイアについて
次のように、MTEntriesタグにcategory/categoriesモディファイアを使った場合、
<mt:Entries category="foo">
<$mt:EntryTitle$>
</mt:Entries>
MTIfCategoryタグやMTEntryIfCategoryを次のように使えば、出力は同じになると思います(間違ってたらすいません)。
<mt:Entries>
<mt:IfCategory name="foo">
<$mt:EntryTitle$>
</mt:IfCategory>
</mt:Entries>
ただし、後者はすべてのブログ記事を取得してから判定するため、再構築のパフォーマンスは前者の方がいいのではないかと思います。
言い換えると、後者のような書き方は通常、すべてのブログ記事を対象にして、その中で個別にカテゴリを判定したい場合に用いるのが適切かと思います。
特定のカテゴリのみで最初からフィルタリングしたい場合は前者を用います。