Получение дочерних категорий товаров из родительской категории в WooCommerce

19 мар. 2020 г., 19:46:37
Просмотры: 14.4K
Голосов: 1

В WooCommerce я пытаюсь получить все дочерние термины категорий товаров по ID родительской категории текущего товара с помощью следующего кода:

$category = get_queried_object();
$category_parent_id = $category->parent;
$category_test = get_terms( ['taxonomy' => 'product_cat', 'hide_empty' => false] );

Переменная $category_parent_id возвращает ID родительской категории товара, а $category_test возвращает все термины категорий товаров.

Я пытаюсь получить все дочерние категории товаров, используя ID родительской категории, полученный из $category->parent.

Логично, что я попробовал:

$category_test = $category_parent_id->get_terms( ['taxonomy' => 'product_cat', 'hide_empty' => false] );

и

$category_test = $category->parent->get_terms( ['taxonomy' => 'product_cat', 'hide_empty' => false] );

Но это не вернуло мне все дочерние категории текущей родительской категории. Кто-нибудь знает, можно ли это сделать и если да, то как?

0
Все ответы на вопрос 1
9

Отредактировано (1)

Вам понадобится использовать аргумент 'child_of' из доступных параметров WP_Term_Query, который позволит получить все дочерние термины для текущей родительской категории товара:

// Только на страницах архивов категорий товаров
if( is_product_category() ) {
    $main_term = get_queried_object();

    $args_query = array(
        'taxonomy' => 'product_cat', 
        'hide_empty' => false, 
        'child_of' => $main_term->parent
    );

    if ( $main_term->parent != 0 ) {
        // Перебор объектов WP_Term
        foreach ( get_terms( $args_query ) as $term ) {
            if( $term->term_id != $main_term->term_id ) {
                // $term->slug; // Слаг

                // Вывод каждого имени термина (с ссылкой)…
                echo sprintf( '<a href="%s">%s</a></br>', get_term_link( $term->term_id, 'product_cat' ), $term->name );
            }
        }
    }
}

Или вы также можете использовать get_term_children() следующим образом:

// Только на страницах архивов категорий товаров
if( is_product_category() ) {
    $main_term  = get_queried_object();
    $taxonomy   = 'product_cat';

    if ( $main_term->parent != 0 ) {
        $child_ids = get_term_children( $main_term->parent, $taxonomy );

        echo '<ul>';

        foreach ( $child_ids as $child_id ) {
            if( $child_id != $main_term->term_id ) {
                $term = get_term_by( 'id', $child_id, $taxonomy );
                echo '<li><a href="' . get_term_link( $child_id, $taxonomy ) . '">' . $term->name . '</a></li>';
            }
        }
        echo '</ul>';
    }
}

Это работает только на страницах архивов категорий товаров, так как для страниц товаров у вас может быть множество категорий, и код будет более сложным и совершенно другим…

19 мар. 2020 г. 20:10:13
Комментарии

Это действительно выводит все необходимые исходные данные. Есть идеи, как вывести только название и/или слаг, например?

Jeroen_L Jeroen_L
19 мар. 2020 г. 22:42:37

Ответ уже принят, но если у вас найдется время объяснить, как выводить только название и/или слаг вместо исходных данных, это сэкономит мне часы поисков. Если нет, все равно спасибо :)

Jeroen_L Jeroen_L
19 мар. 2020 г. 22:49:33

@Jeroen_L Я обновил свой код, чтобы он выводил название и/или слаг…

LoicTheAztec LoicTheAztec
19 мар. 2020 г. 23:01:18

Только что заметил, что на странице товара он не учитывает родительскую категорию. И также захватывает родителей родительских категорий и их дочерние элементы... Есть идеи? В следующем сообщении поделюсь своим новым кодом, если интересно.

Jeroen_L Jeroen_L
20 мар. 2020 г. 00:11:30

@Jeroen_L Я обновил свой ответ другим кодом... Теперь на странице товара логика совсем другая, так как товар может принадлежать к нескольким категориям...

LoicTheAztec LoicTheAztec
20 мар. 2020 г. 00:37:44

Мне нужно проверить, но уже поздно, а что если на странице товара (is_product) — будет ли это тоже работать? Проверю завтра, пока спасибо.

Jeroen_L Jeroen_L
20 мар. 2020 г. 00:55:41

@Jeroen_L Код обрабатывает только страницы архивов категорий товаров, так как у товара может быть несколько категорий... Поэтому обработка страниц товаров будет совсем другой и более сложной задачей, и вам стоит задать новый вопрос по работе со страницами товаров...

LoicTheAztec LoicTheAztec
20 мар. 2020 г. 07:44:35

Почти получилось...

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

Сейчас происходит следующее: подняться на 1 уровень (родительская категория), получить все категории на этом уровне (что мне и нужно), но если у этих категорий есть подкатегории, они тоже включаются.

То есть сейчас он делает +1 чтобы перейти к родителю, но продолжает идти -1 насколько возможно. Как предотвратить это движение вниз?

Что касается страниц товаров - будет ли проще, если каждый товар будет привязан только к одной категории?

Jeroen_L Jeroen_L
20 мар. 2020 г. 12:13:07

Мне удалось решить проблему с захватом подкатегорий (двоюродных категорий), передавая ID родительской категории и комбинируя другие решения. Я обновлю свой ответ с новым кодом. Осталось только разобраться, как получить этот список на странице товара, если мы знаем ID родительской категории.

Jeroen_L Jeroen_L
20 мар. 2020 г. 16:08:15
Показать остальные 4 комментариев