web-dev-qa-db-fra.com

Comment sortir les tags personnalisés wordpress séparés par des virgules?

Sur la base de quelques références, j'ai créé une fonction permettant de générer une liste de termes de taxonomie personnalisés séparés par des virgules. Le code fonctionne comme prévu, où food_tag est la taxonomie personnalisée que j'ai enregistrée pour un post_type personnalisé.

Voici la fonction:

function get_taxonomy_food_tags(){
 $terms = get_terms('food_tag');
 foreach($terms as $term){

 // The $term is an object, so we don't need to specify the $taxonomy.

 $term_link = get_term_link($term);

 $numItems = count($terms);
 $i        = 0;

 // If there was an error, continue to the next term.

 if (is_wp_error($term_link)){
      continue;
 }

 // We successfully got a link. Print it out.

 echo '<a href="' . esc_url($term_link) . '">' . $term->name . '</a>';

 if (++$i != $numItems) {
            echo ', ';
 }

 }
}

Je place ensuite le code <?php get_taxonony_food_tags(); ?> n'importe où dans les modèles .php de mon thème et je reçois une liste de mes balises personnalisées avec un lien. tel que:

Ingrédients: Bacon, tranches de tomate, sauce tomate, laitue, boeuf,

Il se trouve que la dernière balise du tableau est également imprimée avec une virgule

Comment configurer correctement la fonction pour exclure la dernière virgule?

Merci d'avance.

1
Adriano Monecchi

Vous avez quelques défauts ici:

  • TOUJOURS code de manière à ce que votre code le soit échouer. C'est très important. La plupart des gens codent avec un état d'esprit parfait. Un monde parfait ne se produira jamais. Pensez toujours à ce qui se passera lorsque votre code échouera.

    Par exemple, dans votre code, $terms renvoie un objet de type terme si tout est déplacé. $terms renvoie également un tableau vide s'il n'y a pas de termes dans la taxonomie ou des termes sans articles. Il renvoie également un objet WP_Error si la taxonomie n'existe pas. Ce sont tous des bugs. Taxonomie invalide, vous pouvez demander. Si vous avez correctement enregistré votre taxonomie dans un plugin et que vous désactivez ce plugin, votre taxonomie n'existe plus, ce qui déclenchera l'erreur de taxonomie invalide.

  • Vous devriez commencer votre compteur en dehors de votre boucle foreach. Pas à l'intérieur

  • Le préfixe get_ est utilisé pour les fonctions qui renvoient sa sortie, et non son écho.

  • Toujours désinfecter et valider

Je vais réécrire votre code pour ressembler à ceci: ( NOTE: Nécessite PHP5.4 + )

function get_taxonomy_food_tags( $taxonomy = '', $args = [] )
{
    // Check if we have a taxonomy and that it is valid. If not, return false
    if ( !$taxonomy )
        return false;

    // Sanitize the taxonomy input
    $taxonomy = filter_var( $taxonomy, FILTER_SANITIZE_STRING );

    if ( !taxonomy_exists( $taxonomy ) )
        return false;

    // If we reached this point, our taxonomy is valid. So lets continue. Get our terms
    $terms = get_terms( $taxonomy, $args );

    // We will only check if we have terms, we know our taxonomy is valid because we have reached this point
    if ( empty( $terms ) )
        return false;

    // Great, if we got to this point, we have terms, lets continue
    // Define our variable to hold our term links
    $term_links_array = [];
    foreach ( $terms as $term ) {
        $term_link = get_term_link( $term );

        // Make sure we do not have a WP_Error object, not really necessary, but better be safe
        if ( is_wp_error( $term ) )
            continue;

        // Build an array of term links. Let php do the hard work and calculations
        $term_links_array[] = '<a href="' . esc_url($term_link) . '">' . $term->name . '</a>';
    } // endforeach

    // Make sure that we have an array of term links, if not, return false
    if ( !$term_links_array )
        return false;

    // We have reached this point, lets output our term links
    return implode( ', ', $term_links_array );
}

Vous pouvez maintenant l'utiliser comme suit

echo get_taxonomy_food_tags( 'food_tag' );

J'ai également introduit un deuxième paramètre que vous pouvez utiliser pour transmettre un tableau d'arguments à la fonction get_terms() interne, afin que vous puissiez utiliser la nouvelle fonction de la même manière que la fonction get_terms() par défaut.

2
Pieter Goosen

Le problème est que vous attribuez la valeur 0 à $ i à chaque fois que la boucle foreach est exécutée. Ainsi, lorsque la dernière instruction if est exécutée, chaque fois que la comparaison est égale à 1! = 3, la virgule est toujours imprimée. Essayez de déclarer $ i = 0; en dehors de la boucle foreach. Comme ça:

$terms = get_terms('food_tag');
$i = 0;
foreach($terms as $term){ 

//the code here

}

En outre, il manque une accolade à la fin, c’est peut-être seulement une erreur de copier-coller, mais pour ceux qui essaient de copier-coller et de le faire fonctionner.