特定のカテゴリ/タグの記事を除外して検索する
更新日:2024.02.02
特定のカテゴリ/タグの記事を除外して検索する方法を紹介します。
特定カテゴリの記事を除外する
特定のカテゴリの記事を除外するには、以下のような考え方をします。
- 1.そのカテゴリに属する記事を検索し、記事のIDを読み込みます。
- 2.記事のIDが、1.の条件を満たさない記事を検索します。
たとえば、「カテゴリA」というカテゴリに属さない記事を検索したい場合、以下のようにSearchEntriesタグのブロックを2回書きます。
<mt:SearchConditions entry_ids="cat_a">
<mt:SearchConditionCategorySection>
<$mt:SearchConditionCategory category="カテゴリA"$>
</mt:SearchConditionCategorySection>
</mt:SearchConditions>
<mt:SearchConditions>
<$mt:SearchConditionNotValues field="id" values="$cat_a"$>
</mt:SearchConditions>
特定のタグがついた記事を除外する
特定のタグがついた記事を除外する場合も、カテゴリの除外と同じように考えます。
たとえば、「タグA」というタグがついた記事を除外して検索したい場合は、以下のようにSearchEntriesタグのブロックを2回書きます。
<mt:SearchConditions entry_ids="tag_a">
<mt:SearchConditionTagSection>
<$mt:SearchConditionTag tag="タグA"$>
</mt:SearchConditionTagSection>
</mt:SearchConditions>
<mt:SearchConditions>
<$mt:SearchConditionNotValues field="id" values="$tag_a"$>
</mt:SearchConditions>
サブクエリが必要
上の例で挙げたように、カテゴリ/タグを除外してブログ記事を検索するには、1回目の検索の結果を、2回目の検索の中で使うという処理が必要です。
SQLでは、「サブクエリ」という手法で、このような処理を1つのSQL文にまとめることができます。
ところが、Movable TypeのORMは、サブクエリには対応していません。
そのため、上の例に挙げたように、MTSearchConditionsタグのブロックを2回書く必要があります。
ただ、上記書いたような方法では、ブログ記事が多くなるとパフォーマンスが悪化することが予想できます。