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

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

Posted at May 27,2010 1:55 AM
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>

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

関連記事
zenback
人気エントリー
トラックバックURL


コメント

yujiro様
ご教授ありがとうございます、早速試させていただきました。
理想とするのが「4.「foo」「bar」カテゴリ以外のブログ記事を出力する」なのですが、mt:EntriesWithSubCategoriesタグにlastnモディファイアを入れるとlastnモディファイアが効かないか、一件も表示されなくなるかで表示件数を制御できません。
最初にlastnモディファイアを使うことを申し上げていれば良かったのですが、申し訳ございません、解決策はないでしょうか?

[1] Posted by ODA : May 27, 2010 11:00 PM
コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)