Массив с иерархической структурой терминов (рубрик)

Иногда нужно получить не плоский массив рубрик (терминов), а многомерный массив (древовидный, дерево из категорий), в котором будет сохранена иерархия (вложенность, дерево) терминов.

К примеру, у нас есть следующая структура рубрик:

— Животные
— — Бабочки 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()
	)
)