wordpress カテゴリーのアンド条件で記事を表示

忘れないようにメモ

wordpressのカテゴリーは、階層構造も持てるが、一般に独立している。その独立な複数なカテゴリーをひとつの記事に同時に付与することができる。たとえば、ある記事に、スポーツ、アメリカとつけ、別の記事に政治、イギリス、とつけ、別の記事に、スポーツ、イギリスとつける、といったようにである。

記事を投稿するときには、種類(スポーツ、政治、・・・)、地域(アメリカ、イギリス、・・・)を任意につける。

一方、アーカイブとして記事を表示するときに、複数のカテゴリーを同時に指定して、抽出したいというニーズがでてくる。

また、wordpressには、カテゴリーのアーカイブを表示させる方法が大きくふたつあって、ひとつは、パーマネントリンクを使う方法、もうひとつは、ページテンプレートを使って、query_postsというテンプレートタグに条件を設定する方法だ。(なお、自分で抽出用の関数を作るという方法もあるが、難易度が高く私の能力を超えている)

パーマネントリンクを使う方法は簡便だが、カテゴリーの階層構造にしたがった表示のみで、カテゴリーを一つしか設定できない。一方、テンプレートタグを使う方法は、query_postsには抽出用のオプションパラメータも多様で細かな設定が可能である。

というわけで、テンプレートタグを使う方法を採用する。

テンプレートタグを使うといっても、また、大きくふたつの方法がある。ひとつは、専用のページテンプレートを作って、そのテンプレートの中に、ニーズに応じてテンプレートタグのパラメータを設定するという方法である。この方法の場合は、テンプレートタグの使用説明の通り設定すればよく、多くの解説サイトがあるので、それを参照しながらページテンプレートを作ればよい。

もうひとつの方法は、共通なページテンプレートを使い、カスタムフィールドからテンプレートタグのパラメータを投入する方法である。この方法の利点は、今回の場合でいけば、複数のカテゴリーをアンド条件とした抽出条件で記事のアーカイブを表示するページテンプレートをひとつ作れば、具体的な条件によらず、かなり汎用的に利用できるところにある。

さて、前置きが長くなったが、wordpressで固定ページをつくり、そのときに、特定のカテゴリーの記事だけのアーカイブをリスト形式に表示するという例を考える。ページテンプレートを「Custom Query List」と名付け、記事を抽出するループのところでquery_postsテンプレートタグを使う。

query_postsでは、複数カテゴリー指定を行うためのオプションパラメータ「category__and」(アンダースコアがふたつ続くことに注意)が用意されている。このパラメータはarray形式なので、quest_postsの説明には、

query_posts( array( ‘category__and’ => array( 2, 6 ) ) );

と使用例が記述されている。
したがって、やりたいことは、array( … )の部分を固定ページの編集画面からカスタムフィールドを使って渡すことだが、このまま、テンプレートタグに渡しても、array関数として動作せず、カテゴリー指定の抽出は行われない。

試行錯誤の末、以下の方法にたどり着いた。カスタムフィールドには以下のように記述する。

category__and[0]=2&category__and[1]=6

分かってみれば、単に書き下して書いただけなのだが、データ構造の基本的な理解がいい加減なので簡単にたどり着けなかった。

2011/8/19追記

上記の設定では、たとえば、A∩(B∪C)をどう記述すればよいのかわからない。category__andは親カテゴリーを指定した場合に、小カテゴリーは含まれない。これに対してcatパラメータは子カテゴリーが含まれる。また、多くのケースで親をしてすると、子が付いてくるので、記事にカテゴリーを付ける際には子しか指定しないケースも多い。

今回のニーズは、AかつB。

ただし、Bは親カテゴリーで、配下にCとDを持つ。記事には、Bが付与されることはなく、CやDが付与される。

このため、単純にcategory__andは使えなかったし、記事ごとにテンプレートタグに渡すパレメータの指定方法もググったけれども見つからない。

そこで、苦肉の策として、

cat=B&category__and[0]=A

とやってみた。異なるパラメータの間の「&」はand条件として機能し、catパラメータではB配下の小カテゴリーも付いてくるはず。一応、うまく行っているような気はするが、汎用的な解決方法ではないことに注意。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。