Конечная HTML структура, сформированная вашей функцией, содержит дубликаты термов. Вероятно, это связано с рекурсивным вызовом функции и областью видимости. Как можно исправить эту проблему?
Для создания и отображения иерархического дерева терминов в WordPress вы можете использовать функцию `wp_list_categories()` с параметром `taxonomy` для указания таксономии, которую вы хотите отобразить.
Пример:
```php
<ul>
<?php wp_list_categories('taxonomy=category&title_li='); ?>
</ul>
```
Чтобы исправить проблему дубликатов терминов, можно создать рекурсивную функцию, которая будет строить дерево терминов и учитывать уже выведенные термины. Например:
```php
function display_hierarchy_terms($parent_id = 0, $depth = 0, $displayed_terms = array()) {
$args = array(
'taxonomy' => 'category',
'parent' => $parent_id
);
$terms = get_categories($args);
foreach ($terms as $term) {
if (!in_array($term->term_id, $displayed_terms)) {
echo str_repeat('—', $depth) . $term->name . '<br>';
$displayed_terms[] = $term->term_id;
display_hierarchy_terms($term->term_id, $depth + 1, $displayed_terms);
}
}
}
display_hierarchy_terms();
```
Эта функция будет строить и отображать иерархическое дерево терминов, предотвращая дубликаты терминов. Она использует массив `$displayed_terms`, чтобы отслеживать уже выведенные термины и исключать их из повторного вывода.
<pre><code class="php">function get_categories_tree(string $taxonomy = 'category'): array
{
$terms = get_terms([
'taxonomy' => $taxonomy,
'parent' => false,
'hide_empty' => false,
]);
if (empty($terms) || $terms instanceof WP_Error) {
return [];
}
$categories = [];
foreach ($terms as $term) {
$categories[] = (object) [
'value' => $term->term_id,
'name' => $term->name,
'children' => get_children_categories($term->term_id, $category_id),
];
}
return $categories;
}
function get_children_categories(int $parent_term_id, int $category_id): array
{
$children = array();
$child_terms = get_terms([
'taxonomy' => 'category',
'parent' => $parent_term_id,
'hide_empty' => false,
]);
foreach ($child_terms as $child_term) {
$child = (object) [
'term_id' => $child_term->term_id,
'name' => $child_term->name,
'value' => $child_term->term_id,
];
$grandchildren = get_children_categories($child_term->term_id, $category_id);
if (!empty($grandchildren)) {
$child->children = $grandchildren;
}
$children[] = $child;
}
return $children;
}</code></pre> <br/> <br/> <code class="php">$list = get_categories_tree();</code> <br/> <br/> Как вывести в цикле с рекурсией думаю разберетесь..
<pre><code class="php">function hierarchyTerms($termID, $taxonomy) {
$terms_children = get_term_children($termID, $taxonomy);
if (!is_wp_error($terms_children) && !empty($terms_children)) {
$output = '<ul>';
foreach ($terms_children as $child_id) {
$term = get_term($child_id);
$output .= '<li>' . esc_html($term->name);
$output .= hierarchyTerms($child_id, $taxonomy);
$output .= '</li>';
}
$output .= '</ul>';
return $output;
}
return '';
}</code></pre>