Вывести иерархию категорий товаров по идентификатору товара в Woocommerce - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть товары, которые могут быть в нескольких категориях, например, посмотрите на следующие строки:

  • Cat1> Product1
  • Cat1> Product2
  • Cat2> subcat1> Product1
  • Cat3> subcat1> subcat2> Product1

В woocommerce, если у меня есть продукт, я могу сделать следующее:

    function alg_product_categories_names2( $atts ) {
    $product_cats = get_the_terms( $this->get_product_or_variation_parent_id( $this->the_product ), 'product_cat' );
    $cats = array();

    $termstest= '';
    if ( ! empty( $product_cats ) && is_array( $product_cats ) ) {
        foreach ( $product_cats as $product_cat ) {             
            if ( $term->parent == 0 ) { //if it's a parent category
                    $termstest .= ' PARENTCAT= '. $product_cat->name;
          }                             
        }
    }

    return htmlentities('<categories_names>'. $termstest .'</categories_names>');
}

Но это просто возвращает все родительские категории для идентификатора продукта.

cat1, cat2, subcat1, Cat3, subcat2

Мне трудно с этим.Мне нужен идентификатор продукта, создайте список выше - что должно быть возвращено:

"Cat1> Product1" |"Cat2> subcat1> Product1" |"Cat3> subcat1> subcat2> Product1"

Мне нужно перестроить путь каждой категории из идентификатора продукта.

1 Ответ

0 голосов
/ 15 ноября 2018

Чтобы получить всех предков категории продукта, вы можете использовать функцию Wordpress get_ancestors()

Следующая пользовательская функция шорткода будет выводиться для каждой категории продуктаданного продукта, предки с категорией продукта в строке, определенной в вашем вопросе:

add_shortcode( 'product_cat_list', 'list_product_categories' )
function list_product_categories( $atts ){
    $atts = shortcode_atts( array(
        'id' => get_the_id(),
    ), $atts, 'product_cat_list' );

    $output    = []; // Initialising
    $taxonomy  = 'product_cat'; // Taxonomy for product category

    // Get the product categories terms ids in the product:
    $terms_ids = wp_get_post_terms( $atts['id'], $taxonomy, array('fields' => 'ids') );

    // Loop though terms ids (product categories)
    foreach( $terms_ids as $term_id ) {
        $term_names = []; // Initialising category array

        // Loop through product category ancestors
        foreach( get_ancestors( $term_id, $taxonomy ) as $ancestor_id ){
            // Add the ancestors term names to the category array
            $term_names[] = get_term( $ancestor_id, $taxonomy )->name;
        }
        // Add the product category term name to the category array
        $term_names[] = get_term( $term_id, $taxonomy )->name;

        // Add the formatted ancestors with the product category to main array
        $output[] = implode(' > ', $term_names);
    }
    // Output the formatted product categories with their ancestors
    return '"' . implode('" | "', $output) . '"';
}

Код находится в файле function.php вашей активной дочерней темы (активной темы).Проверено и работает.


ИСПОЛЬЗОВАНИЕ:

1) В php-коде страницы продукта:

echo do_shortcode( "[product_cat_list]" );

2) В phpкод с указанным идентификатором продукта (здесь идентификатор продукта 37 например) :

echo do_shortcode( "[product_cat_list id='37']" );

Я думаю, что название продукта не требуется в выводе , поскольку оно повторяется (для каждой категории продуктов) .Таким образом, вы получите что-то вроде этого:

"Cat1" | "Cat2>subcat1" | "Cat3>subcat1>subcat2"
...