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:
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>';
?>
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>';
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.
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 )
Pourquoi ne pouvez-vous pas simplement définir l'argument childless
sur true?
$ages = get_terms( array(
'taxonomy' => 'age',
'childless' => true
)
);