Comment lister uniquement les termes enfants d'une taxonomie et non leurs parents?
-
-
Appelez `get_terms` deuxfoiset fusionnez les deuxtableaux de résultats?Call `get_terms` twice and merge the two arrays of results?
- 0
- 2011-07-24
- Mark Duncan
-
@Mark Merci,j'aipensé à lefaire de cettefaçon,maismême sije fusionne lesidentifiants dans untableau,je ne voispas comment celafonctionnerait car ce serait lamême chose que de les listermanuellement - 183,184,ce quine lefaitpas 'ttravailler.@Mark Thanks, I thought of doing it this way, but even if I merge the ID's into an array, I can't see how it would work because it would be the same as listing them manually - 183, 184, which doesn't work.
- 0
- 2011-07-24
- Andrew
-
Après avoir lu la réponse acceptée,je réalisemaintenant que votre questionn'étaitpastout àfait claire,d'après l'apparence des choses que vous vouliez *tous * lestermes,à l'exclusion destermes depremierniveau .. (ce que vouspouvezfaire avec un seul appel à `get_terms`).Votre question se lisait comme si vous voulieztous lesenfants de 2termesparentsparticuliers.Having read the accepted answer i now realise your question wasn't entirely clear, from the looks of things you wanted *all* terms, excluding top level ones.. (which you can do with a single `get_terms` call). Your question read as if you were wanting all children of 2 particular parent terms..
- 0
- 2011-07-26
- Mark Duncan
-
5 réponses
- votes
-
- 2011-07-25
Cela devraitfonctionnerpour 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>';
This should work for you:
$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>';
-
Merci @Manny,atravaillé un régal.J'aipris ce que vous avezfourniet l'ai écrasé dans lemenu de sélection queje recherchais.Supertruc.Thanks @Manny, worked a treat. I took what you provided and mashed it into the select menu I was after. Great stuff.
- 0
- 2011-07-25
- Andrew
-
Aucunproblème.Heureux que cela aitfonctionnépour vous.No problem. Glad it worked out for you.
- 0
- 2011-07-25
- Manny Fleurmond
-
Voir la réponse de ** karimhossenbux ** ci-dessouspour une réponsebeaucoupplusefficace.See **karimhossenbux**'s answer below for a much more efficient answer.
- 1
- 2016-03-15
- dotancohen
-
`$term->name`n'estpas valide dans`get_term_link () `,iln'accepte que leterme ID,slug ou objet`$term->name` is invalid in `get_term_link()`, it only accepts the term ID, slug or object
- 0
- 2016-03-15
- Pieter Goosen
-
- 2016-03-15
Vouspouvez égalementfaire:
$terms = get_terms($taxonomyName); foreach($terms as $term) { if ($term->parent != 0) { // avoid parent categories //your instructions here } }
J'ai remarqué que leparent a le champ "parent" égal à 0,et qu'unenfant a sonidentifiant deparent dedans.
You could also do:
$terms = get_terms($taxonomyName); foreach($terms as $term) { if ($term->parent != 0) { // avoid parent categories //your instructions here } }
I've noted that parent have "parent" field equal to 0, and a child have his parent id in it.
-
La réponse acceptéeexécute N appelsget_terms ()et s'exécuteen tempspolynomial.Cette réponseexécute un seul appel àget_terms ()et s'exécuteen temps linéaire.** C'est unebien meilleure réponse. **The accepted answer runs N get_terms() calls and runs in polynomial time. This answer runs a single get_terms() call and runs in linear time. **This is a much better answer.**
- 4
- 2016-03-15
- dotancohen
-
@dotancohen Vouspouvezfaire cela sans avoir àexclure lestermes deniveau supérieuren sortie,vouspouvez supprimer lestermes deniveau supérieur avec leparamètre `wpse_exclude_top` ajouté aux arguments de la requête ;-).Je suis cependant d'accord,c'estplus rapide que la réponse acceptée@dotancohen You can do this without having to exclude top level terms on output, you can remove top level terms with the `wpse_exclude_top` parameter added to the query arguments ;-). I do however agree, this is faster than the accepted answer
- 0
- 2016-03-15
- Pieter Goosen
-
@PieterGoosen: Merci Pieter.J'aijuste récupéré le code source 4.4.2pour les chaînes `wpse_exclude_top`et`exclude_top`maisje ne les aipastrouvées.[Google] (http://google.com/search?q=wpse_exclude_top)ne le saitpasnonplus.Oùest-il documenté?@PieterGoosen: Thank you Pieter. I just grepped the 4.4.2 source code for the strings `wpse_exclude_top` and `exclude_top` but did not find them. Nor does [google](http://google.com/search?q=wpse_exclude_top) know about that. Where is it documented?
- 1
- 2016-03-16
- dotancohen
-
@dotancohen dansma réponse ;-)@dotancohen in my answer ;-)
- 1
- 2016-03-16
- Pieter Goosen
-
- 2016-03-15
Nouspouvonsexclure lesparents deniveau supérieuren lesfiltranten utilisant les
terms_clauses
filtrepourmodifier la requête SQL avant sonexécution. De cettefaçon,nousn'avonspasbesoin d'ignorer lesparents dans labouclefinaleforeach
carilsne sontpas dans letableau determes renvoyé,celanous évite untravailet un codageinutilesVouspouvezessayer 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 );
Pourexclure lesparents depremierniveau,nouspouvonsmaintenantpasser
'wpse_exclude_top' => 1
avecnotretableau d'arguments. Lenouveauparamètrewpse_exclude_top
estprisen chargepar lefiltre 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 remarque,
get_term_link()
fairenonn'acceptepas lenom duterme,uniquement,le slug,l'ID ou leterme objet complet. Pour lesperformances,transmetteztoujours leterme objet àget_term_link()
si leterme objetest disponible ( comme dans ce cas )We can exclude the top level parents by filtering them out by using the
terms_clauses
filter to alter the SQL query before it executes. This way we do not need to skip parents in the finalforeach
loop as they are not in the returned array of terms, this saves us unnecessary work and codingYou can try the following:
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 );
To exclude top level parents, we can now pass
'wpse_exclude_top' => 1
with our array of arguments. The newwpse_exclude_top
parameter is supported by the filter above$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>'; }
Just a note,
get_term_link()
do no not accept the term name, only, slug, ID or the complete term object. For performance, always always pass the term object toget_term_link()
if the term object is available (as in this case) -
-
définir l'argument `` sansenfant '' surtrue signifie que vousne pouvez aller qu'unniveau deprofondeur,donc celane fonctionnepaspour lestaxonomies avec 3niveaux ouplus.setting the ```childless``` argument to true means you can only go 1 level deep, so this doesn't work for taxonomies with 3 or more levels.
- 0
- 2018-04-23
- GeckoSEO
-
-
- 2015-12-29
Si vous affichez l'enfant deplusieursparents,vouspouvezessayer ceci.Afficher lesidentifiants duterme dementiontermeenfant.
$termIds = array(367, 366, 365, 364, 363, 362); $taxonomyName = "age"; $args = array( 'orderby' => 'term_id', 'order' => 'DESC', 'hide_empty' => false, 'childless' => false, ); $terms = get_terms( $taxonomyName, $args ); if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){ $inc = 1; foreach ( $terms as $term ) { if (in_array($term->parent, $termIds)) { echo '<option value="'.$term->term_id.'"><font><font>'.$term->name.'</font></font></option>'; } } }
If you display multiple parent's child, you can try this. Display mention term ids child term.
$termIds = array(367, 366, 365, 364, 363, 362); $taxonomyName = "age"; $args = array( 'orderby' => 'term_id', 'order' => 'DESC', 'hide_empty' => false, 'childless' => false, ); $terms = get_terms( $taxonomyName, $args ); if ( ! empty( $terms ) && ! is_wp_error( $terms ) ){ $inc = 1; foreach ( $terms as $term ) { if (in_array($term->parent, $termIds)) { echo '<option value="'.$term->term_id.'"><font><font>'.$term->name.'</font></font></option>'; } } }
-
Veuillezexpliquerpourquoi vouspensez que ce code devraitfonctionner.Deplus,je suis àpeuprès sûr qu'une solution codéeen durn'estpas lameilleure solution.Please explain why you think this code should work. Also, I am pretty sure that a hard-coded solution is not the best way.
- 1
- 2015-12-29
- s_ha_dum
-
La questionmentionne avec desidentifiants,pour cette raison,j'ai répondu àpenser.Question mentions with ids, for this reason I have answered related think.
- 0
- 2015-12-30
- Jakir Hossain
Je crée unmenu de sélection d'âge dans l'administrateur,alimenté àpartir d'unetaxonomie de
age
. Lataxonomieest hiérarchique comme suit:Je voudrais lister uniquement lesenfants (18,19etc)et non lesparents (18-25,26-30)etc. Actuellement,j'utilise
get_terms
avec leparentparent
,maisiln'acceptepasplus d'un IDparent. Voici ce quej'aijusqu'àprésent,quimontre lesenfants de 18 à 25 ans.Voici ce queje souhaitefaire,mais cen'estpasprisen charge. Je l'ai égalementessayé avec untableaumais celane fonctionnepasnonplus.
Je vois qu'ilexiste unefonction get_term_children ,maisje ne saispasnonplus comment l'utiliser carelle y ressemblen'accepte qu'une seule valeur également. Parexemple: Dans cetexemple,cela créerait une listenon ordonnéemaisje pourraismodifier lemenu de sélection.