TopMovable Typeカスタマイズカテゴリー > 2010年5月
2010年5月27日

親カテゴリーアーカイブにサブカテゴリーのブログ記事を表示する場合に特定のサブカテゴリーのブログ記事をフィルタリングする

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>

以上です。このようにカテゴリをフィルタリングする方法はバリエーションがあるので、色々な試してみてください。

Comments [1] | Trackbacks [0]
Now loading...
ギターに入った猫
掲載広告募集
Styles
Font Size
Default
For defective color vision
Gray Scale
RGB Color
Search this site

このブログをメールで購読する by:FeedBurner

AMN
Categories
Monthly Archives
2020年
2019年
2018年
2017年
2016年
2015年
2014年
2013年
2012年
2011年
2010年
2009年
2008年
2007年
2006年
2005年
2004年
2003年
BlogPeople
Syndicate this site
FeedBurner(RSS1.0/RSS2.0/Atom)
Counter
これまでのアクセス
Powered by
Movable Type 6.0.3