web-dev-qa-db-fra.com

Obtenir les catégories parent principales pour un produit

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;
}
1
Anriëtte Myburgh

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;
}
1
Anriëtte Myburgh

juste pour offrir une solution alternative qui pourrait aider quelqu'un:

code

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

    }

}

comment utiliser

  • juste au-dessus, ancêtre d'origine; sans lien
    wc_Origin_trail_ancestor();
  • juste au-dessus, ancêtre d'origine; avec lien
    wc_Origin_trail_ancestor(true);
  • sentier des ancêtres; sans lien
    wc_Origin_trail_ancestor(false,true);
  • sentier des ancêtres; avec lien
    wc_Origin_trail_ancestor(true,true);

remarques

  • ne fonctionnera pas si un produit a plusieurs catégories principales ou supérieures, ou du moins ne les montrera pas toutes;
  • il devrait en être de même pour plusieurs sous-catégories du même niveau;
  • Je n'ai fait aucun autre test concernant les points ci-dessus, car la fonction remplit tout ce que je voulais pour ce projet.
2
Nicolai

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

?>
0
Pontus Abrahamsson