J'ai un type de message personnalisé qui a des taxonomies hiérarchiques configurées. Par exemple, mon type de message de "projet" a des catégories de
A
A.1
B
C
J'essaie d'obtenir les taxonomies affichées sous forme de classes sur les éléments <li>
pour chaque publication, mais je veux simplement que les parents de premier niveau soient affichés. Pour le poste que je regarde, il est classé dans les catégories A.1 et C, mais je voudrais retourner A et C.
J'utilise 'parent' => 0
dans les arguments, mais cela me donne les alinéas A.1 et C. J'ai aussi essayé d'utiliser 'hide_empty' => 0
mais cela ne semble pas aider.
Voici mon code:
function project_get_item_classes($post_id = null) {
if ($post_id === null)
return;
$_terms = wp_get_post_terms($post_id, 'construction_type', array( 'parent' => 0, 'hide_empty' => 0 ));
foreach ($_terms as $_term) {
echo " " . $_term->slug;
}
}
Grâce à l'aide de @Bainternet (ici, ainsi que sa contribution qui a conduit à la réponse à cette question ), j'ai pu rassembler le code.
// determine the topmost parent of a term
function get_term_top_most_parent($term_id, $taxonomy){
// start from the current term
$parent = get_term_by( 'id', $term_id, $taxonomy);
// climb up the hierarchy until we reach a term with parent = '0'
while ($parent->parent != '0'){
$term_id = $parent->parent;
$parent = get_term_by( 'id', $term_id, $taxonomy);
}
return $parent;
}
// so once you have this function you can just loop over the results returned by wp_get_object_terms
function project_get_item_classes($taxonomy, $results = 1) {
// get terms for current post
$terms = wp_get_object_terms( get_the_ID(), 'work_type' );
// set vars
$top_parent_terms = array();
foreach ( $terms as $term ) {
//get top level parent
$top_parent = get_term_top_most_parent( $term->term_id, 'work_type' );
//check if you have it in your array to only add it once
if ( !in_array( $top_parent, $top_parent_terms ) ) {
$top_parent_terms[] = $top_parent;
}
}
// build output (the HTML is up to you)
foreach ( $top_parent_terms as $term ) {
echo " " . $term->slug;
}
}
wp_get_post_terms
n'accepte pas les paramètres 'parent'
ou 'hide_empty'
dans son tableau d'arguments, uniquement 'orderby'
, 'order'
et 'fields'
mais vous êtes sur la bonne voie, ajoutez simplement une vérification conditionnelle avant d'exécuter le slug:
function project_get_item_classes($post_id = null) {
if ($post_id === null)
return;
$_terms = wp_get_post_terms($post_id, 'construction_type');
foreach ($_terms as $_term) {
if ($_term->parent == 0) //check for parent terms only
echo " " . $_term->slug;
}
}
Commandez simplement par les parents ...
$terms = wp_get_post_terms( $ID , $tax, array( 'orderby' => 'parent', 'order' => 'ASC' ) );
$myparent = $terms[0];