Woocommerce — Как вывести у категории список подкатегорий 1 уровня?
Есть категории/подкатегории товара. У каждой категории должен выводится список вложенных в нее подкатегорий. Например, Одежда > Верхняя > Жилеты. У категории "Одежда" выводится "Верхняя", у категории "Верхняя" выводится "Жилеты" и т.д.
Код:
remove_action( 'woocommerce_shop_loop_subcategory_title', 'woocommerce_template_loop_category_title', 10 ); add_action( 'woocommerce_shop_loop_subcategory_title', function( $category ) { ?> <div class="flex h-full flex-1 flex-col justify-between gap-8"> <div> <h2 class="text-lg font-normal transition-colors group-hover:text-accent sm:text-xl"><?php echo esc_html( $category->name ); ?></h2> <!-- <ul class="relative z-30 mt-4 flex flex-wrap gap-x-4 gap-y-3 text-sm transition-colors group-hover:text-accent"> <li> <a href="#" class="block hover:text-font">Верхняя</a> </li> <li> <a href="#" class="block hover:text-font">Деловая</a> </li> <li> <a href="#" class="block hover:text-font">Домашняя</a> </li> <li> <a href="#" class="block hover:text-font">Повседневная</a> </li> <li> <a href="#" class="block hover:text-font">Спортивная</a> </li> <li> <a href="#" class="block hover:text-font">Торжественная</a> </li> </ul> --> </div> </div> <?php }, 10 ); |
remove_action( 'woocommerce_shop_loop_subcategory_title', 'woocommerce_template_loop_category_title', 10 ); add_action( 'woocommerce_shop_loop_subcategory_title', function( $category ) { ?> <div class="flex h-full flex-1 flex-col justify-between gap-8"> <div> <h2 class="text-lg font-normal transition-colors group-hover:text-accent sm:text-xl"><?php echo esc_html( $category->name ); ?></h2> <!-- <ul class="relative z-30 mt-4 flex flex-wrap gap-x-4 gap-y-3 text-sm transition-colors group-hover:text-accent"> <li> <a href="#" class="block hover:text-font">Верхняя</a> </li> <li> <a href="#" class="block hover:text-font">Деловая</a> </li> <li> <a href="#" class="block hover:text-font">Домашняя</a> </li> <li> <a href="#" class="block hover:text-font">Повседневная</a> </li> <li> <a href="#" class="block hover:text-font">Спортивная</a> </li> <li> <a href="#" class="block hover:text-font">Торжественная</a> </li> </ul> --> </div> </div> <?php }, 10 );
Результат:
Дополнительно:
Не экономь буквы если хочешь получить ответ, решающий твою задачу.
А это код - выкинь. И никогда не используй такую статику.
По вопросам из серии "Почему не использовать родное меню?" понимаю что в суть вопроса вникать нет никакого желания. Тогда зачем вообще что-то писать, тратя и мое, и свое время?
"А это код - выкинь. И никогда не используй такую статику" - совет отличный. Суть вопроса как раз в том, чтобы эту статику сделать динамикой.
Можешь не отвечать. Вопрос я уже свой решил
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

Чтобы на странице категории WooCommerce вывести только подкатегории первого уровня, нужно брать дочерние термины текущей категории. Не надо выводить все уровни сразу, иначе получится каша и дубли.
Код для вывода подкатегорий текущей категории:
add_action('woocommerce_before_shop_loop', function () { if (!is_product_category()) { return; } $current = get_queried_object(); if (!$current || empty($current->term_id)) { return; } $children = get_terms([ 'taxonomy' => 'product_cat', 'parent' => $current->term_id, 'hide_empty' => false, ]); if (is_wp_error($children) || empty($children)) { return; } echo '<ul class="product-subcategories">'; foreach ($children as $child) { echo '<li><a href="' . esc_url(get_term_link($child)) . '">' . esc_html($child->name) . '</a></li>'; } echo '</ul>'; }, 5);
Если пользователь находится в “Одежда”, будут показаны только прямые дети “Одежды”. Если он находится в “Верхняя”, будут показаны только прямые дети “Верхняя”, например “Жилеты”.
Для оформления:
.product-subcategories { display: flex; flex-wrap: wrap; gap: 10px; margin: 0 0 24px; padding: 0; list-style: none; } .product-subcategories a { display: inline-flex; padding: 8px 14px; border: 1px solid #dbe3ef; border-radius: 8px; text-decoration: none; }
Если подкатегории выводятся дважды, проверьте настройки WooCommerce “Отображение категории” и действия темы. Возможно, тема уже выводит категории стандартным циклом, а ваш код добавляет их повторно.
Если нужно показывать подкатегории только там, где они есть, а товары ниже скрывать, дополнительно настройте отображение в WooCommerce или меняйте основной запрос. Но для большинства каталогов лучше показывать подкатегории отдельным блоком сверху, а товары оставлять ниже.
Также не забудьте про пустые категории. Если хотите показывать даже пустые подкатегории для навигации, оставляйте
hide_empty => false. Если нужны только разделы с товарами, ставьтеtrue.Итог: используйте
get_terms()с параметромparentравным текущей категории. Так вы получите именно один уровень вложенности.