Вопрос или проблема
Этот код отображает только категории, как я могу изменить его, чтобы также включать подкатегории. Спасибо.
Спасибо, с помощью этого кода все перечисляется вместе, я хочу, чтобы это отображалось так
- Категория 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();
?>
Разбор кода
-
Функция
get_categories_list($parent)
:- Принимает идентификатор родительской категории как аргумент.
- Использует метод
get_terms
для получения всех категорий с заданным родителем, и исключает пустые категории.
-
Цикл
foreach
:- Проходит по каждой категории, проверяет, не является ли она "Uncategorized", и формирует ссылку на категорию.
- С помощью рекурсивного вызова
get_categories_list( $cat->term_id )
получает подкатегории для текущей категории.
-
Возвращение результата:
- Все результаты собираются в строку, и подкатегории отображаются в виде вложенного
<ul>
.
- Все результаты собираются в строку, и подкатегории отображаются в виде вложенного
Заключение
Этот подход предоставляет вам полный контроль над структурой категорий и подкатегорий. Использование рекурсивной функции позволяет легко обходить иерархическую структуру категорий, что делает ваш код гибким и расширяемым. Убедитесь, что вся информация отображается правильно, а ссылки на категории ведут на соответствующие страницы.
Обратите внимание на безопасность — используйте функции esc_url()
и esc_html()
для экранирования вывода, что поможет защитить ваш код от XSS-уязвимостей.