【wordpress】指定したタームの子タームの情報を取得する

2017年1月21日

タクソノミーのタームに親子関係を付けて、指定した親タームに対して、それにぶらさがる子タームを取得する方法。

ブランドの中のカテゴリ

ブランドA
 ーブランドAのパンツ
 ーブランドAのシャツ
 ーブランドAのズボン

ブランドB
 ーブランドBのパンツ
 ーブランドBのシャツ
 ーブランドBのズボン

ここでブランドBのタクソノミーページ(taxsonomy.php)を表示させたときに、

 ーブランドBのパンツ
 ーブランドBのシャツ
 ーブランドBのズボン

この子達を取得したい。

タクソノミーは”brands”だとして。
/brands/ブランドB/
って感じのurlになる。

子要素のIDたちを取得 → foreachで全部取得

使うのはこの子達こんな感じ。

//指定したIDの子供をIDの配列で返してくれる
get_term_children( ブランドBのID, 'brands');
//指定したIDの情報を返してくれる
get_term_by( ブランドBの子供達のID, 'brands');

まとめる

//get_term_childrenで指定したタームID($shiteiID)から子タームのIDを取得する
$termchildren = get_term_children( $shiteiID, 'brands');
//取得した子タームIDからそれぞれget_term_byで情報を拾う
foreach ( $termchildren as $child ) {
	$test = get_term_by( 'id', $child, 'brands' );
	var_dump($test);
}

get_postsでtaxonomyに関連する投稿(子タームも含めて)取得

子タームを取得した後、子タームが設定されてる投稿を表示させる

	//タクソノミーネーム
	$taxonomyName = "brands";
	//親タームだとprentが0なのでこれを指定
	$args = array(
		'parent' => 0
	);
	//親を取得
	$terms = get_terms($taxonomyName,$args);
	foreach ($terms as $term) {
		echo "<h2 style='font-size:30px;margin:20px 0;'>$term->name</h2>";
		//親のIDを取得できた
		$parentId = $term->term_id;

		/*ここから親タームのIDがそれぞれ取得できるので、そこから子タームのリストを作る*/
		//さっきはparentが0だったが、こんかいはprentが親IDの場合の条件
		//
		$childargs = array(
			'parent' => $parentId,
			'hide_empty' => false//投稿がない場合も隠さずにだす
		);
		$childterms = get_terms($taxonomyName,$childargs);
		foreach ($childterms as $childterm) {
			$targetSlug = $childterm->slug;
			echo "<h2 style='font-size:16px;margin:10px 0;'>$childterm->name</h2>";//子タームの名前
			echo "<p style='font-size:12px; margin-bottbom: 10px;'>".$targetSlug."</p>";//子タームのスラッグ
			//子ターム情報が取得できたので、ここからget_posts用に準備
			$postargs = array(
				'post_type' => 'shop',//さっきのbrandsタクソノミーを使ってる“投稿”のポストタイプ
				'tax_query' => array(
					array(
						'taxonomy' => $taxonomyName,
						'field' => 'slug',//フィールドをslugにしておくterm_idとかでも良いはず
						'terms' => $targetSlug//上で準備してある$childterm->slug
					)
				)
			);
			//あとはいつも通り取得
			$postslist = get_posts( $postargs );

			foreach ( $postslist as $post ) : setup_postdata( $post );
			echo "<li>".get_the_title()."</li>";

			endforeach;
			wp_reset_postdata();
		}
	}

前に同じようなのつくってたから、と思ったらもう一階層したのもつくらなきゃいけなくて疲れたメモ。仕事だるい。