Woocommerce — Как вывести у категории список подкатегорий 1 уровня?

Ссылка скопирована
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 — Как вывести у категории список подкатегорий 1 уровня?

Дополнительно:

Не экономь буквы если хочешь получить ответ, решающий твою задачу.

  • Refguser, а разве вопрос и скрин к нему не объясняют задачу?
  • webl2m, если бы было всё однозначно понятно я бы, возможно, дал ответ, а не писал того, что выше.
  • Refguser, спасибо. Расписал более подробно
  • webl2m, Нда... ГДЕ "выводиться"? (Место на странице, а не "на странице категории"). Почему не использовать родное меню? Какая тема? И ещё 100500 вопросов..
    А это код - выкинь. И никогда не используй такую статику.
  • Refguser, на странице Магазина должны быть категории с подкатегориями (как на скрине). И все.
    По вопросам из серии "Почему не использовать родное меню?" понимаю что в суть вопроса вникать нет никакого желания. Тогда зачем вообще что-то писать, тратя и мое, и свое время?

    "А это код - выкинь. И никогда не используй такую статику" - совет отличный. Суть вопроса как раз в том, чтобы эту статику сделать динамикой.

    Можешь не отвечать. Вопрос я уже свой решил

  • Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Mobile-редакция Ответ

    Чтобы на странице категории 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);

    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;
    }

    .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 равным текущей категории. Так вы получите именно один уровень вложенности.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно