Извлечение категорий продукта WooCommerce в иерархическом порядке

Я использую этот код и получаю только косую черту для результатов. Я пытаюсь напечатать родительскую категорию продукта WooCommerce.

$prod_cat = get_category_parents($product->id); echo $prod_cat; 

Любая идея, как изменить его, чтобы он печатал имя родительских категорий?

Функция get_category_parents – это функция, которая возвращает родительские категории, передавая в качестве аргумента идентификатор категории .

Итак, если у вас есть продукт, и вы хотите получить список прикрепленных категорий к нему, то правильная функция – get_the_terms Эта функция возвращает все объекты категорий без заказа, и поэтому вы можете взять первую из этих категорий и вызвать get_category_parents ,

Предполагая, что переменная $product содержит объект post, вы можете использовать

 $cats = get_the_terms( $product->ID, 'product_cat' ); echo $cats ? get_category_parents( array_shift($cats)->term_id ) : ''; 

Ниже код должен делать то, что вы хотите, он имеет преимущество в работе в средах product и product category . Кроме того, у него есть несколько вариантов встраивания, как описано в разделе о how to use .

код

 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);

заметки

  • не будет работать, если продукт имеет несколько категорий main- / toplevel или, по крайней мере, не покажет их все;
  • то же самое должно быть в случае нескольких подкатегорий на одном уровне;