親カテゴリーアーカイブにサブカテゴリーのブログ記事を表示する場合に特定のサブカテゴリーのブログ記事をフィルタリングする
Category:[カテゴリー]
Tag:[Category, MovableType, MTEntriesWithSubCategories]
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>
以上です。このようにカテゴリをフィルタリングする方法はバリエーションがあるので、色々な試してみてください。
- MTEntriesタグのcategoryモディファイアに「AND」を含むカテゴリを指定する
- ブログ記事ページに自分が属するカテゴリのツリーと直属カテゴリの他のブログ記事一覧を表示する
- Movable Type 5でのMTEntriesタグのcategory/catgoriesモディファイアの動作改善について
- 特定のカテゴリのブログ記事を表示する
- 親カテゴリページにサブカテゴリページのリンクを表示する
- Movable Type 5(MT5)のカテゴリ削除動作
- sort_method モディファイア(その2)
- sort_method モディファイア(その1)
- Movable Type でカテゴリ別にブログ記事の背景画像を切り替える(カスタムフィールド編)
- Movable Type でカテゴリ別にブログ記事の背景画像を切り替える
- 親カテゴリーアーカイブに表示したサブカテゴリーのブログ記事にサブカテゴリー名を表示する
- ブログ記事のない親カテゴリーに子カテゴリーのブログ記事を表示する(Movable Type 4.25~)
- カテゴリーアーカイブページの最後に「続きを読む」のリンクを表示する
- Movable Type のカテゴリーリストで特定のカテゴリーを非表示にする
- dTree カテゴリーリストにブログ記事数を表示する
- カテゴリークラウド for Movable Type
- カテゴリーの階層別にデザインを切り替える for Movable Type 4
- カテゴリーリストの中に月別カテゴリーリストを表示する
- サブカテゴリーリストを定義型リストでマークアップする
- ブログ記事に同一カテゴリーのブログ記事の前後リンクを表示する
yujiro様
ご教授ありがとうございます、早速試させていただきました。
理想とするのが「4.「foo」「bar」カテゴリ以外のブログ記事を出力する」なのですが、mt:EntriesWithSubCategoriesタグにlastnモディファイアを入れるとlastnモディファイアが効かないか、一件も表示されなくなるかで表示件数を制御できません。
最初にlastnモディファイアを使うことを申し上げていれば良かったのですが、申し訳ございません、解決策はないでしょうか?
