2つのカスタム投稿タイプから記事を取得するが、1つはタクソノミーで絞り込みたい時のtax_queryの書き方でハマったのでメモ。
カスタム投稿タイプとカスタムタクソノミー
カスタム投稿タイプ: CD(cd)
カスタムタクソノミー: cd_category
カスタム投稿タイプ: DVD(dvd)
カスタムタクソノミー: dvd_category
みたいな感じで、それぞれカスタム投稿タイプとカスタムタクソノミー(カテゴリー)が設定されている。
やりたいこと
- CDは「全て」のカテゴリーの記事を取得する
- DVDはタクソノミーが 「ライブ(live)」 の記事を取得する
tax_queryの書き方
$args = [
'post_type' => ['dvd', 'cd'],
'tax_query' => [
'relation' => 'OR',
[
'taxonomy' => 'dvd_category',
'field' => 'slug',
'terms' => 'live'
],
[
'taxonomy' => 'dvd_category',
'operator' => 'NOT EXISTS'
],
]
];
query_posts($args);
ポイントはtax_queryの2つ目の配列。
カスタム投稿タイプ「CD」の「全て」を取りたいので、cd_categoryを指定したくなるが、'operator' => 'ALL'
の様な指定ができない。
CDに対してのtax_queryを指定しないと、dvd_category = live の条件がCDにも反映されてしまって、結果0件になってしまう。
そこで、 dvd_category が NOT EXISTS = CD全て という取り方をする必要がある。