WP_Term_Queryで階層付きのタームリストを出力する方法
作成日:
2019年5月10日
比較的最近WordPressに追加されたWP_Term_Queryを用いることで、WP_Queryのような複雑な条件を付加してタームを取得出来るようになりました。
しかしながら、WP_Term_Queryで出力されるタームは階層状態の無いフラットなリストとなるので、wp_list_categoriesのような階層付きのulリストを得ることが出来ません。
そこで、WP_Term_Queryを使用して、orderやexclude等の条件を加味した上で階層付きのタームリストを出力する方法を考えてみました。
- 条件を設定してWP_Term_Queryを実行する
- それぞれのタームのID、名前(これは最終的に出力したい要素で置き換えて下さい)、親ID、先祖個数、子配列(ここでは空の配列)で$term_ary配列を作成する
- 先祖個数の最大値を$level_numとして保存しておく
- $level_numの回数分、最も先祖個数が多いタームから順に親IDの子配列に格納していく
これで、条件通りのタームと表示順序で階層を持った配列を作成することが出来ました。
後は配列から順に取り出していけば
以下、参考コードです。
PHP
// 条件.
$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[] = 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 );
物草 灸太郎
WordPressでホームページを制作しつつ、休日は畑を耕したりDIYを楽しんでいます。
コメントをどうぞ