Movable TypeのMTIfCategoryタグとMTEntryIfCategoryタグの違い
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>
ただし、後者はすべてのブログ記事を取得してから判定するため、再構築のパフォーマンスは前者の方がいいのではないかと思います。
言い換えると、後者のような書き方は通常、すべてのブログ記事を対象にして、その中で個別にカテゴリを判定したい場合に用いるのが適切かと思います。
特定のカテゴリのみで最初からフィルタリングしたい場合は前者を用います。
- Movable Type6で記事のない親カテゴリのカテゴリページを出力する方法
- Movable Typeでブログ記事が属するカテゴリアーカイブのリンクをブログ記事ページに表示する
- Movable Typeで「カテゴリ+年別」の記事一覧を表示する方法
- Movable Typeで親カテゴリーアーカイブに表示した記事のメインカテゴリまでのパンくずリストを表示する
- Movable Typeのカテゴリのベースネームについて
- Movable Typeで複数ブログのブログ記事を同名のカテゴリ別に振り分ける方法
- Movable Typeのカテゴリリストで階層別に背景画像を変更する
- Movable Typeのカテゴリ・フォルダで特定の最上位階層を表示しない方法
- Movable Typeのカテゴリリストにダミーの親カテゴリを表示する
- MTEntriesタグのcategoryモディファイアに「AND」を含むカテゴリを指定する
- ブログ記事ページに自分が属するカテゴリのツリーと直属カテゴリの他のブログ記事一覧を表示する
- Movable Type 5でのMTEntriesタグのcategory/catgoriesモディファイアの動作改善について
- 親カテゴリーアーカイブにサブカテゴリーのブログ記事を表示する場合に特定のサブカテゴリーのブログ記事をフィルタリングする
- 特定のカテゴリのブログ記事を表示する
- 親カテゴリページにサブカテゴリページのリンクを表示する