web-dev-qa-db-fra.com

Récupération de la taxonomie personnalisée dans l'ordre, mais en excluant des ID de taxe spécifiques

J'ai une fonction configurée et opérationnelle basée sur la discussion dans ce fil de discussion: Taxonomie personnalisée, get_the_terms, liste dans l'ordre parent> enfant .

Ma version inclut des liens de terme et me permet d'afficher les informations de terme dans single.php d'une manière qui ressemble à un fil d'Ariane. Cependant, j'ai un terme personnalisé configuré que je ne souhaite jamais afficher pour les utilisateurs, car il s'agit d'un crochet utilisé par les éditeurs de contenu afin qu'ils puissent afficher des publications au sommet de boucles spécifiques dans d'autres zones du site.

Auparavant, une fonction d'exclusion get_the_term_list fonctionnait, mais elle n'était pas affichée dans l'ordre.

Comment puis-je corriger ma fonction afin que les termes soient affichés dans l'ordre, mais que le terme X est exclu?.

Ma fonction actuelle (avec exclude ne fonctionne pas correctement actuellement) est la suivante:

function terms_by_order( $terms, $taxonomy, $exclude = array() ) {

// check input
if ( empty( $terms ) || is_wp_error( $terms ) || ! is_array( $terms ) )
    return;

// set id variables to 0 for easy check 
$grandparent_id = $parent_id = $term_id = 0;

// get grandparent
 foreach ( $terms as $term ) { 
    if ( $grandparent_id || $term->parent && !($exclude) )
        continue;
    $grandparent_id = $term->term_id;
    $grandparent_slug    = $term->slug;
    $grandparent_url = '<a href="'.get_term_link($grandparent_slug, $taxonomy).'">'.$term->name.'</a>';
}

 // get parent
foreach ( $terms as $term ) { 
    if ( $parent_id || $grandparent_id != $term->parent && !($exclude) ) 
        continue;
    $parent_id = $term->term_id;
    $parent_slug    = $term->slug;
    $parent_url = '<a href="'.get_term_link($parent_slug, $taxonomy).'">'.$term->name.'</a>';
}

// get child
foreach ( $terms as $term ) { 
    if ( $parent_id || $parent_id != $term->parent && !($exclude) ) 
        continue;
    $term_id =  $term->term_id;
    $term_slug = $term->slug;
    $term_url = '<a href="'.get_term_link($term_slug, $taxonomy).'">'.$term->name.'</a>';
}

    echo "$grandparent_url / $parent_url / $term_url";
}

C'est la balise que j'utilise sur mon single.php pour l'appeler en action

terms_by_order( get_the_terms( $post->ID, 'news_category' ),'news_category',array(3623) );

Voici un exemple de ce à quoi cela est censé ressembler lorsqu’il est exécuté correctement:

Musique/Interview/

3
Ashkas

Hélas pas de réponses ou de commentaires! : P

Ne vous inquiétez pas, un collègue m'a aidé ici et voici le code ci-dessus fonctionnant avec un $ exclude

function terms_by_order($taxonomy, $exclude) {
global $post;
$terms = get_the_terms($post->ID, $taxonomy);

// check input
if ( empty($terms) || is_wp_error($terms) || !is_array($terms) ) return;

// exclude 
foreach ($terms as $key=>$term) {
    if (in_array($key, $exclude)) {     // key in term_array is also term_id..
        unset($terms[$key]);
        break;
    }
}


foreach ($terms as $key=>$term) {
    $parent_term = $term;           // gets last parent (should we get only the first one?)
    if ($term->parent != 0) {       // if there is a child, find it
        $child_term = $term;        // get the child term...
        $parent_term = get_term_by('id', $term->parent, $taxonomy);     // ... and the parent term
        break;
    }
}

if (isset($parent_term)) echo '<a href="'.get_term_link($parent_term, $taxonomy).'">'.$parent_term->name.'</a>';
if (isset($child_term)) echo ' / <a href="'.get_term_link($child_term, $taxonomy).'">'.$child_term->name.'</a>';

}
1
Ashkas