it-swarm.com.de

Erster benutzerdefinierter Feldwert (von mehreren), der nach der Abfrage zweimal angezeigt wird

Ich habe den folgenden Code, der auf der Lösung für diese Frage basiert:

<?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>';
      }
    }
?>

Jetzt erhalte ich eine Liste aller Begriffe in der Taxonomie game und unter jedem Begriff erhalte ich den Titel und den Permalink für jeden mit dem Begriff verknüpften Beitrag. Dieser Teil funktioniert gut.

Das Problem ist der kleine Absatz, den ich unter jedem Post-Titel/Link zurückgeben möchte. Aus irgendeinem Grund wird der erste Wert im Absatz zweimal zurückgegeben.

Das heißt für das Codebit, das lautet:

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

Wenn $ number = 1 ist, wird 1 (das ist $number) angezeigt, wenn nichts angezeigt werden soll. Wenn $ number = 2 ist, wird 22x (das ist $number . $number . 'x') angezeigt, wenn 2x angezeigt werden soll.

Wenn ich das Codebit mit $ number vollständig auskommentiere, wird 'Array' . $val . ', ' zurückgegeben, da das nächste Codebit das Array $ val zurückgibt.

Wenn ich die gesamte PHP innerhalb des Absatzes auskommentiere, erhalte ich den berühmten weißen Bildschirm. Vermutlich, weil versucht wird, einen nicht vorhandenen Wert anzuzeigen.

Anfangs dachte ich, es könnte sich um einen Fehler handeln wie den hier erklärten , weshalb ich unset () an verschiedenen Stellen platziert habe, aber das scheint nichts zu beeinflussen, was auf dem angezeigt wird Seite? ˅.

Mir fehlt vielleicht etwas Offensichtliches, aber ich kann wirklich nicht herausfinden, warum es den ersten Wert zurückgibt. Kann jemand den Fehler im Code erkennen?

1
rpbtz

Ich habe es geschafft, es zu beheben! Wie ich vermutet habe, hatte es nichts mit dem Code zu tun, der sich auf $number bezieht, sondern mit dem Aufruf von echo davor.

Mein ursprünglicher Code sah folgendermaßen aus (ich überspringe einen Teil des Schleifeninhalts, um ihn einfach zu halten):

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>';

Wenn $number = 1 angezeigt wird, $number, und wenn $number > 1), wird $number . $number . 'x' angezeigt.

Nachdem ich einige Zeit später den Code hier durchgesehen hatte, bemerkte ich, dass etwas nicht stimmte. Bei meinem ersten Aufruf von echo beende ich mit einem ., damit der folgende Code in meinem Absatz hinzugefügt werden kann. Aber als ich den Absatz beendet habe, habe ich einen neuen echo-Aufruf hinzugefügt, anstatt den Schleifencode mit . '</p>' zu verfolgen.

Was ich getan habe, um das Problem zu beheben, war, meinen anfänglichen echo-Aufruf zu beenden, anstatt ihn fortzusetzen. Um dies zu beheben, musste ich nur ein Zeichen ändern und ein Leerzeichen in der ersten Zeile entfernen. So sieht es aus:

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

Beachten Sie das Ende dieses Codeteils im Vergleich zu dem, wie es aussah, bevor ich es reparierte. Ich habe einfach . durch ; ersetzt.

Ich kenne nicht genug PHP, um dieses Verhalten zu erklären, obwohl ich annehme, dass es etwas damit zu tun hat, dass die echo nicht richtig beendet/geschlossen wird. Wenn jemand anderes dies genauer erklären kann, können Sie gerne einen Kommentar hinzufügen, und ich werde diese Antwort entsprechend aktualisieren.

0
rpbtz