Конечная 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`, чтобы отслеживать уже выведенные термины и исключать их из повторного вывода.
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; }
$list = get_categories_tree();
Как вывести в цикле с рекурсией думаю разберетесь..
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 ''; }