web-dev-qa-db-fra.com

Comment lister uniquement les termes enfants d'une taxonomie et non leurs parents?

Je crée un menu de sélection d’âge dans l’administrateur, composé d’une taxonomie de age. La taxonomie est hiérarchique comme suit:

  • 18-25 (parent, ID 183)
    • 18 (enfant)
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
  • 26-30 (parent, ID 184)
    • 26
    • 27
    • 28
    • 29
    • 30

Je voudrais seulement énumérer les enfants (18, 19, etc.) et non les parents (18-25, 26-30), etc. Actuellement, j'utilise get_terms avec l'argument parent, mais il n'accepte pas plus d'un ID parent. . Voici ce que j'ai jusqu'à présent, qui montre les enfants de 18 à 25 ans.

    $ages = get_terms( 'age', array(
        'hide_empty' => 0,
        'parent' => '183',
    ));

Voici ce que je veux qu'il fasse, mais ce n'est pas supporté. J'ai aussi essayé avec un tableau, mais cela ne fonctionne pas non plus.

    $ages = get_terms( 'age', array(
        'hide_empty' => 0,
        'parent' => '183,184',
    ));

Je vois qu’il existe une fonction get_term_children mais je ne sais pas trop comment l’utiliser, car il semble qu’elle accepte uniquement une valeur. Exemple: dans cet exemple, une liste non ordonnée serait créée, mais je pourrais modifier pour sélectionner le menu.

<?php
    $termID = 183;
    $taxonomyName = "age";
    $termchildren = get_term_children( $termID, $taxonomyName );

    echo '<ul>';
    foreach ($termchildren as $child) {
    $term = get_term_by( 'id', $child, $taxonomyName );
    echo '<li><a href="' . get_term_link( $term->name, $taxonomyName ) . '">' . $term->name . '</a></li>';
    }
    echo '</ul>';
?> 
8
Andrew

Cela devrait fonctionner pour vous:

$taxonomyName = "age";
//This gets top layer terms only.  This is done by setting parent to 0.  
$parent_terms = get_terms( $taxonomyName, array( 'parent' => 0, 'orderby' => 'slug', 'hide_empty' => false ) );   
echo '<ul>';
foreach ( $parent_terms as $pterm ) {
    //Get the Child terms
    $terms = get_terms( $taxonomyName, array( 'parent' => $pterm->term_id, 'orderby' => 'slug', 'hide_empty' => false ) );
    foreach ( $terms as $term ) {
        echo '<li><a href="' . get_term_link( $term ) . '">' . $term->name . '</a></li>';   
    }
}
echo '</ul>';
13
Manny Fleurmond

Vous pouvez aussi faire:

$terms = get_terms($taxonomyName);
foreach($terms as $term) {
    if ($term->parent != 0) { // avoid parent categories
        //your instructions here
    }
}

J'ai remarqué que le champ "parent" du parent était égal à 0 et qu'un enfant avait son identifiant de parent.

12
karimhossenbux

Nous pouvons exclure les parents de niveau supérieur en les filtrant en utilisant le filtre terms_clauses pour modifier la requête SQL avant son exécution. De cette façon, nous n'avons pas besoin de sauter les parents dans la dernière boucle foreach, car ils ne figurent pas dans le tableau de termes renvoyé. Cela nous évite des tâches et des codages inutiles

Vous pouvez essayer ce qui suit:

add_filter( 'terms_clauses', function (  $pieces, $taxonomies, $args )
{
    // Check if our custom arguments is set and set to 1, if not bail
    if (    !isset( $args['wpse_exclude_top'] ) 
         || 1 !== $args['wpse_exclude_top']
    )
        return $pieces;

    // Everything checks out, lets remove parents
    $pieces['where'] .= ' AND tt.parent > 0';

    return $pieces;
}, 10, 3 );

Pour exclure les parents de premier niveau, nous pouvons maintenant passer 'wpse_exclude_top' => 1 avec notre tableau d'arguments. Le nouveau paramètre wpse_exclude_top est pris en charge par le filtre ci-dessus.

$terms = get_terms( 'category', ['wpse_exclude_top' => 1] );
if (    $terms
     && !is_wp_error( $terms )
) {
    echo '<ul>';
        foreach ($terms as $term) {
            echo '<li><a href="' . get_term_link( $term ) . '">' . $term->name . '</a></li>';  
        }
    echo '</ul>';
}

Juste une note, get_term_link() ne pas accepter le nom du terme, seulement, slug, ID ou l’objet terme complet. Pour des performances, passez toujours le terme objet à get_term_link() si le terme objet est disponible ( comme dans ce cas )

3
Pieter Goosen

Pourquoi ne pouvez-vous pas simplement définir l'argument childless sur true?

$ages = get_terms( array(
    'taxonomy' => 'age',
    'childless' => true
    )
);
1
Yaron