Как создать и отобразить иерархическое дерево терминов в WordPress?

Конечная HTML структура, сформированная вашей функцией, содержит дубликаты термов. Вероятно, это связано с рекурсивным вызовом функции и областью видимости. Как можно исправить эту проблему?
  • 18 августа 2024 г. 18:33
Ответы на вопрос 3
Для создания и отображения иерархического дерева терминов в 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 ''; 
}
Похожие вопросы