Woocommerce - Как получить категорию высшего уровня текущей категории продуктов
У меня есть продукт Woocommerce, и мне нужно отобразить на этой странице категорию высшего уровня категории, присвоенной продукту
- Main Product Category
-- Sub Product Category
--- Category Assigned to product
Мне нужно получить идентификатор или имя "Главная категория продукта", чтобы я мог отображать его в категории одного продукта.
Я уже пробовал сделать следующее:
global $post;
$terms = get_the_terms( $post->ID, 'product_cat' );
foreach ($terms as $term) {
$product_cat_id = $term->term_id;
$thetop_parent = woocommerce_get_term_top_most_parent( $product_cat_id , 'product_cat' );
echo $thetop_parent;
}
Но это вообще не сработало, и он тормозит страницу после загрузки после woocomerce_get_term... Я не уверен, что делать в этот момент It
спасибо за любую помощь по этому поводу.
Ответы
Ответ 1
После многих исследований я решил способ решить эту проблему. Надеюсь, это поможет кому-то.
решение:
global $post;
$prod_terms = get_the_terms( $post->ID, 'product_cat' );
foreach ($prod_terms as $prod_term) {
// gets product cat id
$product_cat_id = $prod_term->term_id;
// gets an array of all parent category levels
$product_parent_categories_all_hierachy = get_ancestors( $product_cat_id, 'product_cat' );
// This cuts the array and extracts the last set in the array
$last_parent_cat = array_slice($product_parent_categories_all_hierachy, -1, 1, true);
foreach($last_parent_cat as $last_parent_cat_value){
// $last_parent_cat_value is the id of the most top level category, can be use whichever one like
echo '<strong>' . $last_parent_cat_value . '</strong>';
}
}
Ответ 2
или, может быть, это:
$cat = get_the_terms( $product->ID, 'product_cat' );
foreach ($cat as $categoria) {
if($categoria->parent == 0){
echo $categoria->name;
}
}
Ответ 3
Я знаю, что это старый пост, но у меня была аналогичная ситуация, когда нам нужно было получить корневую категорию текущего продукта. Самое простое решение, о котором я подумал, - это посмотреть, как WooCommerce делает свои панировочные сундуки, и этот кусок кода - вот что помогло мне:
if ( is_product() ) {
global $post;
$terms = wc_get_product_terms( $post->ID, 'product_cat', array( 'orderby' => 'parent', 'order' => 'DESC' ) );
if ( ! empty( $terms ) ) {
$main_term = $terms[0];
$ancestors = get_ancestors( $main_term->term_id, 'product_cat' );
if ( ! empty( $ancestors ) ) {
$ancestors = array_reverse( $ancestors );
// first element in $ancestors has the root category ID
// get root category object
$root_cat = get_term( $ancestors[0], 'product_cat' );
}
else {
// root category would be $main_term if no ancestors exist
}
}
else {
// no category assigned to the product
}
}
Ответ 4
Здесь решение, которое я фактически использую
function get_parent_terms($term) {
if ($term->parent > 0){
$term = get_term_by("id", $term->parent, "product_cat");
return get_parent_terms($term);
}else{
return $term->term_id;
}
}
global $wp_query;
$cat_obj = $wp_query->get_queried_object();
$Root_Cat_ID = get_parent_terms($cat_obj);
Ответ 5
Здесь, если u имеет "category_ID"
/*If you dont have a category ID use this:
* $category_ID = get_queried_object()->term_id;
* This will get you the current category_ID
*/
$termid = get_term($category_ID, 'product_cat' );
if($termid->parent > 0)
{ // get the parent hierarchy.
$cat_hierachy = get_ancestors( $category_ID, 'product_cat' );
return end($cat_hierachy); // returns the Level-1 category_ID
}
return $category_ID; // Has no parent so return THIS category_ID Level-1
Ответ 6
Это функция, которую я разработал для использования.
/**
* Get product top category
* @param int $pid. The product ID
*
* @return int. Returns project parent ID
*/
function get_product_top_category($pid) {
global $wpdb;
$cat_id = $wpdb->get_var('SELECT b.term_id FROM '.$wpdb->prefix.'term_relationships a, '.$wpdb->prefix.'term_taxonomy b WHERE a.object_id = "'.$pid.'" AND a.term_taxonomy_id = b.term_taxonomy_id AND b.parent = "0" AND b.taxonomy = "product_cat" LIMIT 1');
return $cat_id;
}
Таким образом, вы можете получить верхнюю категорию текущего продукта с помощью этого
$top_level_term = get_product_top_category($post->ID);
Ограничением этого кода является то, что он может возвращать несколько категорий верхнего уровня любого продукта. Чтобы бороться с этим, я использовал LIMIT 1
чтобы вернуть только одну категорию, которая мне подходит.