Quelqu'un peut-il m'aider s'il vous plaît, je cherche un moyen de trouver la catégorie de produit parent principale d'un produit WooCommerce? Dites, le produit est marqué sous Gadgets, mais le principal parent de tous est Electronique.
Je le souhaite par publication, car je souhaite ajouter une classe à chaque publication en indiquant son parent principal product_cat
.
N'oubliez pas que les catégories de produits sont une taxonomie personnalisée et ne peuvent pas être récupérées à l'aide de get_category_parents()
. Ils sont énumérés en tant que termes.
Merci d'avance.
// modifier:
C'est le code que j'ai déjà, j'appelle cela sur chaque message et mes messages sont rendus similaires à une page d'archive.
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;
}
J'ai écrit ma propre fonction pour remonter la "chaîne". Mon récursif n'est peut-être pas la meilleure implémentation que vous ayez vue, mais cela fonctionne.
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;
}
juste pour offrir une solution alternative qui pourrait aider quelqu'un:
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);
Vous pouvez essayer ceci:
<?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;
}
?>