Получить основные родительские категории для продукта
Может ли кто-нибудь, пожалуйста, помочь мне, я ищу способ найти основную категорию родительского продукта продукта 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;
}
3 answers
Просто чтобы предложить альтернативное решение, которое может кому-то помочь:
Код
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);
Примечания
- не будет работать, если продукт имеет несколько категорий основного/верхнего уровня или, по крайней мере, не будет отображаться их всех;
- то же самое должно быть в случае нескольких подкатегорий на одном уровне;
- Я больше не проводил никаких тестов по вышеуказанным пунктам, потому что функция делает все, что я хотел для этого проекта;
Я написал свою собственную функцию, чтобы пройти весь путь вверх по "цепочке". Моя рекурсивная реализация, возможно, не самая лучшая из тех, что вы видели, но она работает.
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;
}
# Will return all categories of a product, including parent categories
function all_cat_classes($post) {
$cats = "";
$terms = get_the_terms($post->ID, "product_cat");
$key = 0;
// foreach product_cat get main top product_cat
foreach ($terms as $cat) {
$cat = get_parent_terms($cat);
$cats .= (strpos($cats, $cat->slug) === false ? $cat->slug." " : "");
$key++;
}
return $cats;
}
Вы можете попробовать это:
<?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;
}
?>