WP_Term_Queryで階層付きのタームリストを出力する方法

WP_Term_Queryで階層付きのタームリストを出力する方法



比較的最近WordPressに追加されたWP_Term_Queryを用いることで、WP_Queryのような複雑な条件を付加してタームを取得出来るようになりました。

しかしながら、WP_Term_Queryで出力されるタームは階層状態の無いフラットなリストとなるので、wp_list_categoriesのような階層付きのulリストを得ることが出来ません。

そこで、WP_Term_Queryを使用して、orderやexclude等の条件を加味した上で階層付きのタームリストを出力する方法を考えてみました。

  1. 条件を設定してWP_Term_Queryを実行する
  2. それぞれのタームのID、名前(これは最終的に出力したい要素で置き換えて下さい)、親ID、先祖個数、子配列(ここでは空の配列)で$term_ary配列を作成する
  3. 先祖個数の最大値を$level_numとして保存しておく
  4. $level_numの回数分、最も先祖個数が多いタームから順に親IDの子配列に格納していく

これで、条件通りのタームと表示順序で階層を持った配列を作成することが出来ました。
後は配列から順に取り出していけば

以下、参考コードです。

// 条件.
$taxonomy = 'taxonomy...';
$args = array(
	'taxonomy' => $taxonomy,
	// その他の条件...
);
// クエリ.
$term_ary   = array();
$level_num  = 0;
$term_query = new WP_Term_Query( $args );
if ( ! empty( $term_query ) && ! is_wp_error( $term_query ) ) {
	foreach ( $term_query->terms as $term ) {
		$ancestors = get_ancestors( $term->term_id, $taxonomy );
		if ( $level_num < count( $ancestors ) ) {
			$level_num = count( $ancestors );
		}
		$term_ary&#91;&#93; = array(
			'id'        => $term->term_id,
			'name'      => $term->name,
			'parent'    => $term->parent,
			'ancestors' => count( $ancestors ),
			'child'     => array(),
		);
	}
}
// 配列調整.
$counter    = $level_num;
$parent_ary = array_column( $term_ary, 'id' );
for ( $i = 0; $i < $level_num; $i++ ) {
	foreach ( $term_ary as $key => $val ) {
		if ( $counter === $val['ancestors'] ) {
			$parent = array_search( $val['parent'], $parent_ary, true );
			if ( false !== $parent && isset( $term_ary[ $parent ] ) ) {
				$term_ary[ $parent ]['child'][] = $val;
				unset( $term_ary[ $key ] );
			}
		}
	}
	$counter--;
}
print_r( $term_ary );
今日はここまで

関連する記事



こちらはいかが?


コメントを残す