Использование get_term_children для получения подкатегорий родительской категории текущего товара
В моей теме WooCommerce я создал корневую категорию: 'Бренды', а затем для каждого товара добавил его бренд как подкатегорию к родительской категории 'Бренды'.
На странице товара я хочу отобразить бренд текущего продукта.
global $post;
// Получаем ID категории 'brands' по её ярлыку
$brands_id = get_term_by('slug', 'brands', 'product_cat');
// Получаем дочерние элементы этой категории
$termchildren = get_term_children( $brands_id, 'product_cat' );
// Перебираем дочерние элементы категории 'brand', чтобы вывести название бренда
foreach ( $termchildren as $child ) {
$term = get_term_by( 'id', $child, 'product_cat' );
echo '<a href="' . get_term_link( $child, 'product_cat' ) . '">' . $term->name . '</a>';
}
Этот код всегда выводит все бренды. Как мне отфильтровать эту информацию и оставить только бренды, связанные с текущим товаром?

Не нужно использовать get_term_children()
вообще. Просто пройдитесь циклом по get_the_terms()
, чтобы получить нужные данные.
global $post;
$brands_id = get_term_by('slug', 'brands', 'product_cat');
$terms = get_the_terms($post->ID, 'product_cat');
foreach ($terms as $term) {
if($term->parent === $brands_id->term_id) {
echo $term->name;
break;
}
}

// Получаем ID термина по его ярлыку (slug) 'brands' в таксономии 'product_cat'
$term_id = get_term_by( 'slug', 'brands', 'product_cat' );
// Указываем название таксономии
$taxonomy_name = 'product_cat';
// Получаем дочерние термины для указанного термина
$termchildren = get_term_children( $term_id, $taxonomy_name );
// Выводим начало списка
echo '<ul>';
// Перебираем все дочерние термины
foreach ( $termchildren as $child ) {
// Получаем данные термина по его ID
$term = get_term_by( 'id', $child, $taxonomy_name );
// Выводим элемент списка с ссылкой на термин
echo '<li><a href="' . get_term_link( $child, $taxonomy_name ) . '">' . $term->name . '</a></li>';
}
// Закрываем список
echo '</ul>';

В первую очередь, я уже задавал этот же вопрос здесь и сам нашел ответ :)
Вот как это нужно делать:
$taxonomies = array(
'brands'
);
$args = array(
'orderby' => 'name',
'order' => 'ASC',
'fields' => 'all',
'parent' => '(parentID)',
'hierarchical' => true,
'child_of' => 0
);
$terms = get_terms($taxonomies, $args);
var_dump($terms);
foreach ($terms as $term) {
print '<h2 class="story-heading">'.$term->name.'</h2>';
}
Если вам уже известен ID родительской категории, просто передайте его как целое число (INT), и в цикле foreach вы получите все дочерние термины (подкатегории) родителя. Кроме того, если вам нужно повторно использовать этот код, то есть если вы хотите несколько раз отображать один и тот же запрос и получать разные термины родитель -> потомок
, я рекомендую написать функцию и разместить её в файле functions.php. Функция должна выглядеть примерно так:
function get_children_of_parent_terms($tax, $pid) {
$taxonomies = $tax;
$args = array(
'orderby' => 'name',
'order' => 'ASC',
'fields' => 'all',
'parent' => $pid,
'hierarchical' => true,
'child_of' => 0
);
$terms = get_terms($taxonomies, $args);
var_dump($terms);
foreach ($terms as $term) {
print '<h2 class="story-heading">'.$term->name.'</h2>';
}
}
add_action('init','get_children_of_parent_terms');
И тогда, когда вам нужно запросить дочерние элементы родительского термина (категории), вы просто вызываете эту функцию, передавая название родительской категории таксономии как $tax и ID родителя как $pid, например: echo get_children_of_parent_terms('brands','15');
. Предполагая, что у вас есть таксономия brands и какой-то родительский термин с ID 15, это выведет все дочерние термины термина с ID 15.
Удачи!
