Массив с иерархической структурой терминов (рубрик)
Иногда нужно получить не плоский массив рубрик (терминов), а многомерный массив (древовидный, дерево из категорий), в котором будет сохранена иерархия (вложенность, дерево) терминов.
К примеру, у нас есть следующая структура рубрик:
— Животные — — Бабочки 1 — — Бабочки 2 — — Бабочки 3 — — Самые распространенные бабочки — — — Белые — Растения
Нам нужно получить такую же структуру, но в виде древовидного массива.
Для этого используем такую функцию:
/** * @param array $terms * @param array $result_tree * @param int $parent_id */ function make_hierarchical_terms( & $terms, & $result_tree, $parent_id = 0 ) { foreach ( $terms as $i => $term ) { if ( $term->parent == $parent_id ) { $result_tree[ $term->term_id ] = $term; unset( $terms[ $i ] ); } } foreach ( $result_tree as $term ) { $term->children = []; make_hierarchical_terms( $terms, $term->children, $term->term_id ); } }
Используем так:
$categories = get_terms( 'category', [ 'hide_empty' => false ] ); $category_tree = []; make_hierarchical_terms( $categories, $category_tree ); print_r( $category_tree );
Получим следующий массив:
Array ( [1] => WP_Term Object ( [term_id] => 1 [name] => Животные [slug] => animals [term_group] => 0 [term_taxonomy_id] => 1 [taxonomy] => category [description] => [parent] => 0 [count] => 5 [filter] => raw [children] => Array ( [18] => WP_Term Object ( [term_id] => 18 [name] => Бабочки 1 [slug] => babochki-1 [term_group] => 0 [term_taxonomy_id] => 18 [taxonomy] => category [description] => [parent] => 1 [count] => 5 [filter] => raw [children] => Array() ) [24] => WP_Term Object ( [term_id] => 24 [name] => Бабочки 2 [slug] => babochki-2 [term_group] => 0 [term_taxonomy_id] => 24 [taxonomy] => category [description] => [parent] => 1 [count] => 1 [filter] => raw [children] => Array() ) [25] => WP_Term Object ( [term_id] => 25 [name] => Бабочки 3 [slug] => babochki-3 [term_group] => 0 [term_taxonomy_id] => 25 [taxonomy] => category [description] => [parent] => 1 [count] => 1 [filter] => raw [children] => Array() ) [26] => WP_Term Object ( [term_id] => 26 [name] => Самые распространенные бабочки [slug] => babochki-4 [term_group] => 0 [term_taxonomy_id] => 26 [taxonomy] => category [description] => [parent] => 1 [count] => 2 [filter] => raw [children] => Array ( [27] => WP_Term Object ( [term_id] => 27 [name] => Белые [slug] => belye [term_group] => 0 [term_taxonomy_id] => 27 [taxonomy] => category [description] => [parent] => 26 [count] => 0 [filter] => raw [children] => Array() ) ) ) ) ) [22] => WP_Term Object ( [term_id] => 22 [name] => Растения [slug] => rasteniya [term_group] => 0 [term_taxonomy_id] => 22 [taxonomy] => category [description] => [parent] => 0 [count] => 0 [filter] => raw [children] => Array() ) )