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でした。