Получить основные родительские категории для товара

28 июн. 2012 г., 12:06:21
Просмотры: 37.4K
Голосов: 2

Может кто-нибудь помочь, я ищу способ найти основную родительскую категорию товара WooCommerce? Например, товар отмечен в категории Гаджеты, но главным родителем всех этих товаров является Электроника.

Мне нужно это для каждого поста, так как я хочу добавить класс к каждому посту, обозначающий его основную родительскую product_cat.

Пожалуйста, помните, что категории товаров являются пользовательской таксономией и не могут быть получены с помощью get_category_parents(). Они перечислены как термины.

Заранее спасибо.

// правка:

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

function all_cat_classes($post) {
    $cats = "";

    $terms = get_the_terms($post->ID, "product_cat");

    $count = 0;
    $count = count($terms);
    $key = 0;
    foreach ($terms as $cat) {

        $key++;
    }

    return $cats;
}
0
Все ответы на вопрос 3
1

предлагаю альтернативное решение, которое может кому-то помочь:

код

function wc_origin_trail_ancestor( $link = false, $trail = false ) {

    if (is_product_category()) {
        global $wp_query;
        $q_obj = $wp_query->get_queried_object();
        $cat_id = $q_obj->term_id;

        $descendant = get_term_by("id", $cat_id, "product_cat");
        $descendant_id = $descendant->term_id;

        $ancestors = get_ancestors($cat_id, 'product_cat');
        $ancestors = array_reverse($ancestors);

        $origin_ancestor = get_term_by("id", $ancestors[0], "product_cat");
        $origin_ancestor_id = $origin_ancestor->term_id;

        $ac = count($ancestors);

    } else if ( is_product() ) {

        $descendant = get_the_terms( $post->ID, 'product_cat' );
        $descendant = array_reverse($descendant);
        $descendant = $descendant[0];
        $descendant_id = $descendant->term_id;

        $ancestors = array_reverse(get_ancestors($descendant_id, 'product_cat'));
        $ac = count($ancestors);

    }


    $c = 1;
    if( $trail == false ){

        $origin_ancestor_term = get_term_by("id", $ancestors[0], "product_cat");
        $origin_ancestor_link = get_term_link( $origin_ancestor_term->slug, $origin_ancestor_term->taxonomy );

        if($link == true) 
            echo '<a href="'. $origin_ancestor_link .'">';
        echo $origin_ancestor_term->name;
        if($link == true) 
            echo '</a>';

    }else{

        foreach ($ancestors as $ancestor) {
            $ancestor_term = get_term_by("id", $ancestor, "product_cat");
            $ancestor_link = get_term_link( $ancestor_term->slug, $ancestor_term->taxonomy );

            if($c++ == 1) 
                echo '» '; 
            else if($c++ != 1 || $c++ != $ac) 
                echo ' » ';

            if($link == true) 
                echo '<a href="'. $ancestor_link .'">';
            echo  $ancestor_term->name;
            if($link == true) 
                echo '</a>';

        }

        $descendant_term = get_term_by("id", $descendant_id, "product_cat");
        $descendant_link = get_term_link( $descendant_term->slug, $descendant_term->taxonomy );

        echo ' » ';
        if($link == true) 
            echo '<a href="'. $descendant_link .'">';
        echo $descendant->name;
        if($link == true) 
            echo '</a>';

    }

}

как использовать

  • только верхний уровень, исходный родитель; без ссылки
    wc_origin_trail_ancestor();
  • только верхний уровень, исходный родитель; с ссылкой
    wc_origin_trail_ancestor(true);
  • цепочка предков; без ссылки
    wc_origin_trail_ancestor(false,true);
  • цепочка предков; с ссылкой
    wc_origin_trail_ancestor(true,true);

примечания

  • не будет работать, если товар имеет несколько основных/верхнеуровневых категорий, или по крайней мере не покажет их все;
  • то же самое касается нескольких подкатегорий на одном уровне;
  • я не проводил дальнейших тестов по вышеуказанным пунктам, потому что функция делает все, что мне было нужно для этого проекта;
11 сент. 2013 г. 23:51:15
Комментарии

Очень удобно! Справилось с моей задачей! Спасибо, сэр.

Ruvee Ruvee
10 апр. 2021 г. 04:01:44
0

Я написал свою собственную функцию для поднятия по всей "цепочке" вверх. Моя рекурсия, возможно, не самая лучшая реализация, которую вы видели, но она работает.

function get_parent_terms($term) {
    if ($term->parent > 0) {
        $term = get_term_by("id", $term->parent, "product_cat");
        if ($term->parent > 0) {
            get_parent_terms($term);
        } else return $term;
    }
    else return $term;
}

# Возвращает все категории товара, включая родительские категории
function all_cat_classes($post) {
    $cats = ""; 
    $terms = get_the_terms($post->ID, "product_cat");
    $key = 0;

    // Для каждой product_cat получаем главную верхнюю product_cat
    foreach ($terms as $cat) {
        $cat = get_parent_terms($cat);
        $cats .= (strpos($cats, $cat->slug) === false ? $cat->slug." " : "");
        $key++;
    }

    return $cats;
}
6 июл. 2012 г. 10:10:06
1
-1

Вы можете попробовать это:

<?php
  $term = get_term_by( 'slug', get_query_var( 'term' ), get_query_var( 'taxonomy' ) );
  $parents = get_the_terms($term->parent, get_query_var('taxonomy') );

  foreach( $parents as $parent ) {
    echo $parent->name;
  }

?>
28 июн. 2012 г. 12:19:39
Комментарии

Как бы вы обработали более двух уровней категорий?

Anriëtte Myburgh Anriëtte Myburgh
28 июн. 2012 г. 12:38:34