親カテゴリーアーカイブにサブカテゴリーのブログ記事を表示する場合に特定のサブカテゴリーのブログ記事をフィルタリングする
Movable Type(MT)のカテゴリ別ブログ記事リスト(カテゴリーアーカイブ)で、MTEntriesWithSubCategoriesタグを使って、親カテゴリーアーカイブページにサブカテゴリーのブログ記事を表示する場合、特定のサブカテゴリーのブログ記事をフィルタリングする方法を紹介します。
この方法はバージョン4以降で有効です。
1.基本
カテゴリの判定にはMTIfタグとtagモディファイアを使い、tagモディファイアの値に「EntryCategory」を与えます。これで処理中のブログ記事のメインカテゴリを判定できます。
<mt:if tag="EntryCategory" ・・・>
ただし、サブカテゴリがそのブログ記事のメインカテゴリでない場合、この判定にひっかかりません。例えば、親カテゴリが「A」、サブカテゴリが「X」「Y」「Z」という構成で、あるブログ記事のメインカテゴリが、「A」「X」「Y」「Z」とは無関係な「B」で、副カテゴリに「X」が設定されている場合です。
ブログ記事が属するすべてのカテゴリを判定したい場合は、例えば次のようにします。
<mt:EntryCategories>
<mt:if tag="CategoryLabel" ・・・>
</mt:EntryCategories>
以下、メインカテゴリを判定する例でいくつかのパターンを紹介します。副カテゴリを判定したい場合は、判定箇所を上記のリストに入れ替えてください。
2.「foo」「bar」カテゴリのブログ記事のみを出力する
MTIfタグにlikeモディファイアを組み合わせます。モディファイアの値にヒットさせたいカテゴリを「|」で区切って記述します。ただし、この方法では「foo2」や「bari」など、指定した文字列を含むカテゴリも対象になります。
<mt:EntriesWithSubCategories>
<mt:if tag="EntryCategory" like="foo|bar">
<$mt:Include module="ブログ記事の概要"$>
</mt:if>
</mt:EntriesWithSubCategories>
完全一致したカテゴリだけをフィルタリングしたい場合は、MTIfタグとMTElseifタグを組み合わせるとよいでしょう。ヒットさせたいカテゴリ分、MTElseifタグを増やします。MTElseifタグのtagモディファイアを省略すると正常に動作しないので気をつけましょう。
<mt:EntriesWithSubCategories>
<mt:if tag="EntryCategory" eq="foo">
<$mt:Include module="ブログ記事の概要"$>
<mt:elseif tag="EntryCategory" eq="bar">
<$mt:Include module="ブログ記事の概要"$>
</mt:if>
</mt:EntriesWithSubCategories>
副カテゴリも判定したい場合は次のようにします。
<mt:EntriesWithSubCategories>
<mt:EntryCategories>
<mt:if tag="CategoryLabel" eq="foo">
<$mt:Include module="ブログ記事の概要"$>
<mt:elseif tag="CategoryLabel" eq="bar">
<$mt:Include module="ブログ記事の概要"$>
</mt:if>
</mt:EntryCategories>
</mt:EntriesWithSubCategories>
上記のマークアップでは、ひとつのブログ記事にヒットするサブカテゴリが複数設定されていると、ブログ記事が重複して出力されるので、さらに次のような制御が必要です。
<mt:EntriesWithSubCategories>
<mt:SetVar name="flag" value="0" />
<mt:EntryCategories>
<mt:unless name="flag">
<mt:if tag="CategoryLabel" eq="foo">
<$mt:Include module="ブログ記事の概要"$>
<mt:SetVar name="flag" value="1" />
<mt:elseif tag="CategoryLabel" eq="bar">
<$mt:Include module="ブログ記事の概要"$>
<mt:SetVar name="flag" value="1" />
</mt:if>
</mt:unless>
</mt:EntryCategories>
</mt:EntriesWithSubCategories>
3.「foo」カテゴリ以外のブログ記事を出力する
MTIfタグにneモディファイアを組み合わせます。
<mt:EntriesWithSubCategories>
<mt:if tag="EntryCategory" ne="foo">
<$mt:Include module="ブログ記事の概要"$>
</mt:if>
</mt:EntriesWithSubCategories>
4.「foo」「bar」カテゴリ以外のブログ記事を出力する
MTUnlessタグにlikeモディファイアを組み合わせます。ただし「foo2」や「bari」など、指定した文字列を含むカテゴリも除外されます。
<mt:EntriesWithSubCategories>
<mt:unless tag="EntryCategory" like="foo|bar">
<$mt:Include module="ブログ記事の概要"$>
</mt:unless>
</mt:EntriesWithSubCategories>
完全一致したカテゴリだけを除外したい場合はちょっと技が必要になります。ここではMTIfタグとtestモディファイアを組み合わせた例を示します。
MTEntryCategoryタグの内容を一旦変数catに保持して、testモディファイアの中でPerlの条件文を使って判定します。testモディファイアの結果が真であれば、MTIfタグブロックを実行します。
<mt:EntriesWithSubCategories>
<mt:EntryCategory setvar="cat">
<mt:if test="$cat ne 'foo' && $cat ne 'bar'">
<$mt:Include module="ブログ記事の概要"$>
</mt:if>
</mt:EntriesWithSubCategories>
以上です。このようにカテゴリをフィルタリングする方法はバリエーションがあるので、色々な試してみてください。
- Movable Type6で記事のない親カテゴリのカテゴリページを出力する方法
- Movable Typeでブログ記事が属するカテゴリアーカイブのリンクをブログ記事ページに表示する
- Movable Typeで「カテゴリ+年別」の記事一覧を表示する方法
- Movable Typeで親カテゴリーアーカイブに表示した記事のメインカテゴリまでのパンくずリストを表示する
- Movable Typeのカテゴリのベースネームについて
- Movable Typeで複数ブログのブログ記事を同名のカテゴリ別に振り分ける方法
- Movable TypeのMTIfCategoryタグとMTEntryIfCategoryタグの違い
- Movable Typeのカテゴリリストで階層別に背景画像を変更する
- Movable Typeのカテゴリ・フォルダで特定の最上位階層を表示しない方法
- Movable Typeのカテゴリリストにダミーの親カテゴリを表示する
- MTEntriesタグのcategoryモディファイアに「AND」を含むカテゴリを指定する
- ブログ記事ページに自分が属するカテゴリのツリーと直属カテゴリの他のブログ記事一覧を表示する
- Movable Type 5でのMTEntriesタグのcategory/catgoriesモディファイアの動作改善について
- 特定のカテゴリのブログ記事を表示する
- 親カテゴリページにサブカテゴリページのリンクを表示する
yujiro様
ご教授ありがとうございます、早速試させていただきました。
理想とするのが「4.「foo」「bar」カテゴリ以外のブログ記事を出力する」なのですが、mt:EntriesWithSubCategoriesタグにlastnモディファイアを入れるとlastnモディファイアが効かないか、一件も表示されなくなるかで表示件数を制御できません。
最初にlastnモディファイアを使うことを申し上げていれば良かったのですが、申し訳ございません、解決策はないでしょうか?