Отобразить все категории, включая подкатегории, в списке ul.

Вопрос или проблема

Этот код отображает только категории, как я могу изменить его, чтобы также включать подкатегории. Спасибо.
Спасибо, с помощью этого кода все перечисляется вместе, я хочу, чтобы это отображалось так

  • Категория 1
    • Подкатегория 1 внутри категории 1
    • Подкатегория 2 внутри категории 1
    • Подкатегория 3 внутри категории 1
  • Категория 2
<?php 
$args = array(
    'taxonomy'          => 'product_cat',
    'hide_empty'        => false,
    );
$result = get_terms( $args );

?>

<ul class="list-unstyled">

                            <?php
                            foreach ( $result as $cat ) {
                                if ( 'Uncategorized' !== $cat->name ) {
                                $term_link = get_term_link( $cat, 'product_cat' );
                                $cat_thumb_id = get_woocommerce_term_meta( $cat->term_id, 'thumbnail_id', true );
                                $shop_catalog_img_arr = wp_get_attachment_image_src( $cat_thumb_id, 'shop_catalog' );
                                $cat_img = $shop_catalog_img_arr[0];
                            ?>
                            
                            
                                <li><a href="<?php echo $term_link; ?>">
                                        <?php echo $cat->name; ?> 
                                    </a></li>
                                
                            

                        <?php
                            }
                        }
                        ?>

</ul>






Вы знаете, как работают рекурсивные функции? Вот пример:

function get_categories_list( $parent ) {
    $args = array(
        'taxonomy'          => 'product_cat',
        'hide_empty'        => false,
        'parent'            => $parent
    );
    $current_level_categories = get_terms( $args );
    $result="";
    if ( $current_level_categories ) {
        foreach ( $current_level_categories as $cat ) {
            if ( $cat->name == 'Uncategorized' ) continue;
            $term_link = get_term_link( $cat, 'product_cat' );
            $cat_thumb_id = get_woocommerce_term_meta( $cat->term_id, 'thumbnail_id', true );
            $shop_catalog_img_arr = wp_get_attachment_image_src( $cat_thumb_id, 'shop_catalog' );
            $cat_img = $shop_catalog_img_arr[0];
            $result .= '<li><a href="' . $term_link . '">' . $cat->name . '</a>' . get_categories_list( $cat->term_id ) . '</li>';
        }
        $result="<ul class="list-unstyled">" . $result . '</ul>';
    }
    return $result;
}
echo get_categories_list( 0 );

Чтобы отфильтровать категорию “Uncategorized”, лучше ссылаться на ее слаг, а не на ее имя:

if ( $cat->slug == 'uncategorized' ) continue;

Ответ или решение

Для решения задачи отображения категорий и их подкатегорий в виде вложенного списка <ul>, мы можем воспользоваться рекурсивной функцией, которая будет вызывать себя для каждой категории, чтобы получить ее подкатегории. Опираясь на ваши требования, приведем пример кода, который решает данную задачу, а также рассмотрим нюансы его реализации.

Шаг 1: Определение основной рекурсивной функции

Мы создадим функцию get_categories_list, которая принимает идентификатор родительской категории. Если идентификатор равен нулю, это означает, что мы ищем верхние уровни категорий. При каждом вызове функции мы будем собирать подкатегории текущей категории и возвращать их в виде вложенного списка.

Шаг 2: Обработка данных категорий

Внутри функции будем использовать get_terms для получения категорий, обеспечивая при этом выборку только тех, которые не являются "Uncategorized". Для фильтрации используем слаг категории, что более надежный способ, чем использование имени.

Шаг 3: Визуализация в HTML

Мы будем строить HTML-код в виде строки, используя <ul> и <li> теги для представления категории и подкатегорий соответственно.

Вот итоговый код, который вы можете использовать для выполнения поставленной задачи:

<?php

function get_categories_list( $parent = 0 ) {
    $args = array(
        'taxonomy'   => 'product_cat',
        'hide_empty' => false,
        'parent'     => $parent
    );
    $current_level_categories = get_terms( $args );
    $result = "";

    if ( $current_level_categories ) {
        foreach ( $current_level_categories as $cat ) {
            if ( $cat->slug == 'uncategorized' ) continue; // Используем слаг для фильтрации
            $term_link = get_term_link( $cat, 'product_cat' );

            // Сбор данных о категории для изображения можно оставить как нужно
            // $cat_thumb_id = get_woocommerce_term_meta( $cat->term_id, 'thumbnail_id', true );
            // $shop_catalog_img_arr = wp_get_attachment_image_src( $cat_thumb_id, 'shop_catalog' );
            // $cat_img = $shop_catalog_img_arr[0];

            $result .= '<li><a href="' . esc_url($term_link) . '">' . esc_html($cat->name) . '</a>' . get_categories_list( $cat->term_id ) . '</li>';
        }

        $result = '<ul class="list-unstyled">'. $result . '</ul>';
    }

    return $result;
}

echo get_categories_list();

?>

Разбор кода

  1. Функция get_categories_list($parent):

    • Принимает идентификатор родительской категории как аргумент.
    • Использует метод get_terms для получения всех категорий с заданным родителем, и исключает пустые категории.
  2. Цикл foreach:

    • Проходит по каждой категории, проверяет, не является ли она "Uncategorized", и формирует ссылку на категорию.
    • С помощью рекурсивного вызова get_categories_list( $cat->term_id ) получает подкатегории для текущей категории.
  3. Возвращение результата:

    • Все результаты собираются в строку, и подкатегории отображаются в виде вложенного <ul>.

Заключение

Этот подход предоставляет вам полный контроль над структурой категорий и подкатегорий. Использование рекурсивной функции позволяет легко обходить иерархическую структуру категорий, что делает ваш код гибким и расширяемым. Убедитесь, что вся информация отображается правильно, а ссылки на категории ведут на соответствующие страницы.

Обратите внимание на безопасность — используйте функции esc_url() и esc_html() для экранирования вывода, что поможет защитить ваш код от XSS-уязвимостей.

Оцените материал
Добавить комментарий

Капча загружается...