web-dev-qa-db-fra.com

Comment afficher les termes enfant de la taxonomie parentale du terme actuel?

J'aimerais afficher une liste de termes enfants en fonction de ma taxonomie actuelle.

Nom de la taxonomie = 'cours'

  • Photoshop (= terme enfant)

    • ps-thématique n ° 1 (= terme enfant enfant)
    • ps-thématique # 2
    • ...
  • Effets secondaires

    • ae-thématique # 1

    • ae-thématique # 2

    • ...

  • Un autre cours

    • zz-thématique # 1

Donc, dans mon taxonomy-course-photoshop.php, j'aimerais afficher ps-thématique n ° 1, ps-thématique n ° 2, etc.
J'ai trouvé beaucoup de questions et de réponses sur ce sujet.
J'en ai essayé beaucoup.
Sans succès...
Alors maintenant, je me sens très confus entre get_terms, get_children_term. Ou $args= array('parent' => $this_term->term_id,...}

Mon dernier essai était ce topic , qui semble parfait, mais je reçois un message d'erreur: Erreur fatale capturable: l'objet de la classe WP_Error n'a pas pu être converti en chaîne dans

Merci pour toute aide.

2
Cha

Je pense que vous pouvez simplement utiliser get_terms() pour cela. Ceci est juste un code minimum, je suppose que vous voulez aussi ajouter des permaliens, une description de terme ou autre chose.

Cependant, je viens de tester ce code (maintenant testé avec la taxonomie "cours") et cela fonctionne.

Je fais de mon mieux pour commenter le code au fur et à mesure:

// our current taxonomy slug
// If you want to get the current taxonomy automatically try using $wp_query->get_queried_object();
    $taxonomy = 'course';

// we get the terms of the taxonomy 'course', but only top-level-terms with (parent => 0)
$top_level_terms = get_terms( array(
    'taxonomy'      => $taxonomy,
    'parent'        => '0',
    'hide_empty'    => false,
) );

// only if some terms actually exists, we move on
if ($top_level_terms) {

    echo '<ul class="top-level-terms">';

    foreach ($top_level_terms as $top_level_term) {

        // the id of the top-level-term, we need this further down
        $top_term_id = $top_level_term->term_id;
        // the name of the top-level-term
        $top_term_name = $top_level_term->name;
        // the current used taxonomy
        $top_term_tax = $top_level_term->taxonomy;

        // note that the closing </li> is set further down, so that we can add a sub list item correctly
        echo '<li class="top-level-term"><strong>'.$top_term_name.'</strong>';

        // here we get the child-child terms
        // for this we are using 'child_of' => $top_term_id
        // I also set 'parent' => $top_term_id here, with this line you will only see this level and no further childs
        $second_level_terms = get_terms( array(
            'taxonomy' => $top_term_tax, // you could also use $taxonomy as defined in the first lines
            'child_of' => $top_term_id,
            'parent' => $top_term_id, // disable this line to see more child elements (child-child-child-terms)
            'hide_empty' => false,
        ) );

        // start a second list element if we have second level terms
        if ($second_level_terms) {

            echo '<ul class="second-level-terms">';

            foreach ($second_level_terms as $second_level_term) {

                $second_term_name = $second_level_term->name;

                echo '<li class="second-level-term">'.$second_term_name.'</li>';

            }// END foreach

            echo '</ul><!-- END .second-level-terms -->';

        }// END if

        echo '</li><!-- END .top-level-term -->';

    }// END foreach

    echo '</ul><!-- END .top-level-terms -->';

}// END if

Essayez également d’utiliser print_r($top_level_term); par exemple dans la première boucle foreach. Avec cela, vous pouvez voir toutes les informations qui viennent avec un seul terme.

Je dirais que vous devriez utiliser ce code dans le modèle d'archive de taxonomie normale et ne pas utiliser le fichier taxonomy-course-photoshop.php. Parce que vous auriez besoin d’un fichier modèle séparé pour chaque terme, ce qui n’est pas réalisable.

Éditer: Assurez-vous également que certains messages sont attribués aux termes simples et aux sous-termes. Sinon, les termes ne seront pas affichés du tout!


Mise à jour: Oui, vous pouvez obtenir automatiquement la taxonomie actuelle et les données de terme.

Si vous travaillez à l'intérieur de taxonomy-course.php, vous pouvez essayer ceci:

        //get the current object
        $current = $wp_query->get_queried_object();

        // try  var_dump($current);  to see all available data!

        // return the ID of the current term
        // i.e. ID of term "Photoshop" is "26", so we get "26" if we are viewing "Photoshop"
        $current_term_id = $current->term_id;

        // return the nicename of the current term
        // i.e. returns "Photoshop"
        // or "ps-thematic#1" if we are on a child term of "Photoshop"
        $current_name = $current->name;

        // returns the current taxonomy slug we are in
        // i.e. it will return "course"
        $current_taxonomy = $current->taxonomy;

        // returns the ID of the parent, if we have a parent
        // i.e. if we are viewing "ps-thematic#1" it will return the ID of "Photoshop", 26
        // if we are viewing "Photoshop", it will return 0, because "Photoshop" is a top level term
        #$current_parent = $current->parent;

        // display name of current term, i.e. "Photoshop"
        echo '<strong>'.$current_name.'</strong>';

        $sub_terms = get_terms( array(
            'taxonomy'      => $current_taxonomy,
            'child_of'      => $current_term_id,
            'hide_empty'    => false,
        ) );

        // only start is some sub terms exist
        if ($sub_terms) {

            // try  var_dump($sub_terms);  to see all available data!

            echo '<ul class="sub-terms">';

            foreach ($sub_terms as $sub_term) {

                // try  var_dump($sub_term);  to see all available data!

                // only show the name for the example, "ps-thematic#1"
                echo '<li>'.$sub_term->name.'</li>';

            }// END foreach

            echo '</ul><!-- END .sub-terms -->';

        }// END if

Donc, si nous visionnons "Photoshop", la fonction ci-dessus montre UNIQUEMENT:
Photoshop
- ps-thématique # 1
- ps-thématique n ° 2

Il ne montre PAS "After Effects" ou les enfants, une thématique n ° 1 ou une thématique n ° 2.

Jetez également un coup d'oeil en utilisant var_dump($current);. Vous verrez toutes les informations disponibles. Comme vous le verrez ci-dessus, par exemple, j'ai laissé du code dans la fonction $current_parent = $current->parent;.
Par exemple, vous pouvez vérifier:

            // check if current parent is not = 0
            if ($current_parent != '0') {
                // code if parent is NOT 0
                // that always means that we are viewing a child
            } else {
                // code if parent is 0
                // if parent is 0 we are sure we are on a top level
            }

Mais il y a quelques autres informations/données dans $current que vous pouvez peut-être utiliser. J'espère que ça aide.

4
LWS-Mo