Получение дочерних категорий товаров из родительской категории в WooCommerce
В 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] );
Но это не вернуло мне все дочерние категории текущей родительской категории. Кто-нибудь знает, можно ли это сделать и если да, то как?

Отредактировано (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>';
}
}
Это работает только на страницах архивов категорий товаров, так как для страниц товаров у вас может быть множество категорий, и код будет более сложным и совершенно другим…

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

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

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

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

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

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

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

Почти получилось...
Первые тесты показывают, что теперь он поднимается только на 1 уровень вверх, но если у любого из братьев или сестер в этом уровне есть подкатегории, то эти подкатегории тоже отображаются.
Сейчас происходит следующее: подняться на 1 уровень (родительская категория), получить все категории на этом уровне (что мне и нужно), но если у этих категорий есть подкатегории, они тоже включаются.
То есть сейчас он делает +1 чтобы перейти к родителю, но продолжает идти -1 насколько возможно. Как предотвратить это движение вниз?
Что касается страниц товаров - будет ли проще, если каждый товар будет привязан только к одной категории?

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