「WordPressで学ぶPHP(3)関数編」を発売しました。
本書は「WordPressで学ぶPHP(1)変数・制御構造編」「WordPressで学ぶPHP(2)データ構造(配列・オブジェクト)編」の続編にあたり、PHP組み込みの関数や、独自の関数を作る方法などを解説します。
Kindle本で、定価400円です。
SearchEntriesプラグインで特定のカテゴリ/タグの記事を除外して検索する
だいぶ前に、oscarさんから「SearchEntriesプラグインで、特定のタグがついた記事を除外して検索したい」という要望をいただきました。
しかし残念ながら、現状のMovable TypeのORM(Object Relational Mapper)では、このようなことは実現できません。
ただ、現状のプラグインのままでも、パフォーマンスを無視すれば、このようなことを行うことができます。
そこで、特定のカテゴリ/タグの記事を除外して検索する方法を紹介します。
1.特定カテゴリの記事を除外する
特定のカテゴリの記事を除外するには、以下のような考え方をします。
- 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>
2.特定のタグがついた記事を除外する
特定のタグがついた記事を除外する場合も、カテゴリの除外と同じように考えます。
たとえば、「タグ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>
3.サブクエリが必要
上の例で挙げたように、カテゴリ/タグを除外してブログ記事を検索するには、1回目の検索の結果を、2回目の検索の中で使うという処理が必要です。
SQLでは、「サブクエリ」という手法で、このような処理を1つのSQL文にまとめることができます。
ところが、Movable TypeのORMは、サブクエリには対応していません。
そのため、上の例に挙げたように、MTSearchConditionsタグのブロックを2回書く必要があります。
ただ、1.や2.で書いたような方法では、ブログ記事が多くなるとパフォーマンスが悪化することが予想できます。
Movable Type側で、ORMをサブクエリに対応させてほしいです。