pre_get_posts でカスタムポストをカスタムタクソノミーで絞込みしようとして、どっぷりハマってあっさり抜けだした方法 いやー、すっごいハマりました。
あるカスタムポストのアーカイブページを表示するのに、カスタムタクソノミーで絞り込んで表示させたかったので、pre_get_posts をつかってやろうと。
こんなかんじで。
add_action( 'pre_get_posts', 'get_items_in_groups' );
function get_items_in_groups( $query ) {
if ( $query->is_post_type_archive('items') && $query->is_main_query() ) {
$query->set( 'post_type', 'items' );
$query->set( 'posts_per_page', -1 );
$tax_query = array(
'taxonomy' => 'groups',
'field' => 'term_taxonomy_id',
'terms' => htmlentities($_GET['g'], ENT_QUOTES, "utf-8");
'operator' => 'IN',
);
$query->set('tax_query', $tax_query);
$query->set('tax_query',
'relation' => 'AND',
$tax_query
));
}
return $query;
}
カスタムタクソノミーgroups に属する、カスタムポストitemsの投稿を表示するかんじです。
ところがですね。
tax_query がぜんぜん効かない、うまくいかない!
どうやっても、’groups’に関係ないのも含めて、’items’がぜんぶ表示されてしまう。
スペルミスやろか?はたまた、他のプラグインと被ってるんやろか?
とか、いろいろ試して、どうしても解決できず、でもって検索しまくってもわからない。
同じようにうまく行かずに、質問している人は見かけたのですが、その答えもない。
なんと、丸一日悩みまくって、もう仕方がない!とWordPressのコアをたどったり。
でやっと見つけた解決策は、ちょー簡単。
$tax_query = array(
'taxonomy' => 'groups',
'field' => 'term_taxonomy_id',
'terms' => htmlentities($_GET['g'], ENT_QUOTES, "utf-8");
'operator' => 'IN',
);
ではなくて、
$tax_query = array(array(
'taxonomy' => 'groups',
'field' => 'term_taxonomy_id',
'terms' => htmlentities($_GET['g'], ENT_QUOTES, "utf-8");
'operator' => 'IN',
));
ということで、arrayがたりませんでした。。。
ぐぉーー
あと、ちなみに ‘field’ => ‘term_taxonomy_id’ は、 ‘field’ => ‘term_id’ ‘field’ => ‘id’ でもOKでした。