Categories: WordPress開発

pre_get_posts でカスタムポストをカスタムタクソノミーで絞込みしようとして、どっぷりハマってあっさり抜けだした方法

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

nakaike