web-dev-qa-db-fra.com

Première valeur de champ personnalisé (sur plusieurs) affichée deux fois après la requête

J'ai le morceau de code suivant, qui est basé sur la solution à cette question :

<?php
    $game_titles = get_terms('game');

    foreach($game_titles as $game_title) {
        wp_reset_query();
        $args = array('post_type' => 'release',
            'tax_query' => array(
                array(
                    'taxonomy' => 'game',
                    'field' => 'slug',
                    'terms' => $game_title->slug,
                ),
            ),
        );
        unset($game_titles);
        $loop = new WP_Query($args);
        if($loop->have_posts()) {
            echo '<h2>' . $game_title->name . '</h2>';
            echo '<ul>';
            unset($game_title);
            unset($args);

            while($loop->have_posts()) : $loop->the_post();
                echo '<li><a href="' . get_permalink() . '">' . get_the_title() . '</a></li>';
                echo '<p style="color:grey;font-size:11px;margin:0;">(' . 

                    $number = intval(get_post_meta(get_the_ID(), 'number', true)); 
                    if($number > 1){
                      echo $number . 'x';
                    }  

                    $format_value = get_post_meta(get_the_ID(), 'format', true); 
                    foreach($format_value as $key => $val){
                      echo $val . ', ';
                    }
                    unset($val);

                    $version_value = get_post_meta(get_the_ID(), 'version_desc', true);
                    foreach($version_value as $key => $val){
                      echo $val . ', ';
                    }
                    unset($val);

                    $color = get_post_meta(get_the_ID(), 'vinyl_color', true);
                    if($color != 'Black'){
                      if($color != ''){
                        echo ' / ' . $color;
                      }
                    }

                    $country_value = get_post_meta(get_the_ID(), 'country', true);
                    if(! empty($country_value)){
                      echo ' / ' . $country_value . ', ';
                    }
                    else{
                      echo ' / ';
                    }

                    $year_value = get_post_meta(get_the_ID(), 'release_year', true);
                    if(! empty($year_value)){
                      echo $year_value;
                    }

                    $catno_value = get_post_meta(get_the_ID(), 'catalog_no', true);
                    if(! empty($catno_value)){
                      echo ' / ' . $catno_value;
                    }

                echo ')</p>';
            endwhile;
              echo '</ul>';
      }
    }
?>

Maintenant, je reçois une liste de tous les termes de la taxonomie game et sous chaque terme, le titre et le lien permanent de chaque message associé à ce terme. Cette partie fonctionne bien.

Le problème est le petit paragraphe que je voudrais renvoyer sous chaque titre/lien de publication. Pour une raison quelconque, la première valeur du paragraphe est renvoyée deux fois.

C'est à dire. pour le bit de code qui se lit comme suit:

$number = intval(get_post_meta(get_the_ID(), 'number', true)); 
if($number > 1){
    echo $number . 'x';
} 

Si $ number = 1, il affichera 1 (qui est $number) alors qu'il ne devrait rien afficher. Si $ number = 2, il affichera 22x (qui est $number . $number . 'x') alors qu'il devrait afficher 2x.

Si je commente le bit de code en utilisant entièrement $ number, il retournera 'Array' . $val . ', ', car le bit de code suivant renvoie le tableau $ val.

Si je commente tous les php dans le paragraphe, je reçois le fameux écran blanc. Probablement parce qu'il essaie d'afficher une valeur inexistante.

Initialement, je pensais que cela pourrait être une erreur comme celle qui est expliquée ici , ce qui explique pourquoi unset (()) est placé à différents endroits, mais ce n'est pas le cas. semble affecter tout ce qui est affiché sur le site.

Il se peut que je manque quelque chose d'évident, mais je ne peux vraiment pas comprendre pourquoi il renvoie la valeur initiale. Quelqu'un peut-il détecter l'erreur dans le code?

1
rpbtz

J'ai réussi à le réparer! Comme je le soupçonnais, cela n'avait rien à voir avec le code relatif à $number, mais plutôt à l'appel echo qui le précédait.

Mon code initial ressemblait à ceci (je saute une partie du contenu de la boucle pour que cela reste simple):

echo '<p style="color:grey;font-size:11px;margin:0;">(' . 

$number = intval(get_post_meta(get_the_ID(), 'number', true)); 
    if($number > 1){
        echo $number . 'x';
    }

echo ')</p>';

Si $number = 1, il afficherait $number et si $number > 1), il afficherait $number . $number . 'x'

En parcourant le code ici quelques temps plus tard, j'ai remarqué un problème. Lors de mon premier appel echo, je termine par un . afin que le code suivant puisse être ajouté à mon paragraphe. Mais lorsque j'ai terminé le paragraphe, j'ai ajouté un nouvel appel echo au lieu de suivre le code de la boucle avec . '</p>'.

Ce que j'ai fait pour résoudre ce problème a été de mettre fin à mon appel echo initial au lieu de le poursuivre. Il a donc fallu modifier un caractère et supprimer un espace dans la première ligne. Il se présente ainsi:

echo '<p style="color:grey;font-size:11px;margin:0;">(';

Notez la fin de ce morceau de code par rapport à ce à quoi il ressemblait avant de le réparer. J'ai simplement remplacé . par ;.

Je ne connais pas assez de php pour expliquer ce comportement, même si je suppose que cela a quelque chose à voir avec le fait de ne pas terminer/fermer la echo correctement. Si quelqu'un d'autre peut expliquer plus précisément, n'hésitez pas à ajouter un commentaire et je mettrai cette réponse à jour en conséquence.

0
rpbtz