WordPress get_posts()の検索条件で、ちゃんとpost_typeを設定する

WordPress関数「get_posts」でちょっと悩んだのでメモ。

$posts = get_posts($arg);

$argsに検索条件を設定して、条件に一致する投稿データを取得するわけですが。

カスタム投稿タイプ「製品情報(products)」を作り、
そこにカスタムタクソノミー「product_cat」を割り当て、
その下にカテゴリ「cat1」「cat2」「cat3」を用意したとします。

サイドメニューに以下のようなリンクリストを表示しようと思いまして・・・

●製品情報
	●cat1
		・製品A
		・製品B
		・製品C
	●cat2
		・製品D
		・製品E
		・製品F
	●cat3
		・製品G
		・製品H
		・製品I

今回の投稿はその途中段階でget_postsを使った際に困ったお話。
実際のリストの作成については、後日別の投稿にて。

各カテゴリ(cat1,cat2,cat3)に属するページ情報の取得を考えたとき、
tax_queryを使えば楽勝~」と思い、以下のように設定。

//最初に設定した条件(cat1の場合)
$args = array(
	'posts_per_page' => '-1',
	'tax_query' => array(
		array(
			'taxonomy' => 'product_cat',//タクソノミー名を設定
			'field' => 'slug',//条件フィールドにslugを指定
			'terms' => 'cat1' //ここにカテゴリ(term)スラッグを設定
		)
	)
);
$posts_cat1 = get_posts($args);

ちなみに$wp_query->query($args)ならこれでOK。
狙い通りの情報が取得できます。
が、get_postsだとなぜか取得できない。空の配列(array(0){})が返されます。

うまくいったのは以下のコード。
post_typeの指定が必要でした。

//うまくいった設定(cat1の場合)
$args = array(
	'posts_per_page' => '-1',
	'post_type' => 'products', //★この設定が必要
	'tax_query' => array(
		array(
			'taxonomy' => 'product_cat',
			'field' => 'slug',
			'terms' => 'cat1'
		)
	)
);
$posts_cat1 = get_posts($args);

これだけのことがわかるまでに結構時間かけてしまった…。
$wp_query->query($args)でうまくいっていたことがアダとなった…。
CODEXでもWP_Queryクラスを参考にするようなことを言っているからさ、同じだと思うじゃん~。

ま、これで作業が先に進めます。
では実際のリスト生成のコードはまたあとで…。

PHP, Wordpress | , , |