Использование get_term_children для получения подкатегорий родительской категории текущего товара

20 апр. 2014 г., 11:13:59
Просмотры: 16.9K
Голосов: 1

В моей теме 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>';
}

Этот код всегда выводит все бренды. Как мне отфильтровать эту информацию и оставить только бренды, связанные с текущим товаром?

4
Комментарии

Почему ты считаешь, что оно должно фильтроваться именно так? Я не помню, чтобы аргументы принимали term_id в этом месте.

Rarst Rarst
20 апр. 2014 г. 15:56:03

Да, похоже, ты прав, я запутался с возвращаемым массивом

tommyf tommyf
20 апр. 2014 г. 16:32:39

Тогда вопрос решён? :) Или, пожалуйста, обнови свой вопрос.

Rarst Rarst
20 апр. 2014 г. 17:36:01

Вопрос обновлен.

tommyf tommyf
20 апр. 2014 г. 22:30:45
Все ответы на вопрос 3
0

Не нужно использовать 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;
    }
}
21 апр. 2014 г. 08:28:38
0
// Получаем 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>';
21 апр. 2014 г. 08:43:45
0

В первую очередь, я уже задавал этот же вопрос здесь и сам нашел ответ :)

https://wordpress.stackexchange.com/questions/188839/wordpress-tags-and-hierarchy-parent-child-relation

Вот как это нужно делать:

    $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.

Удачи!

23 мая 2015 г. 12:14:48