Первое значение настраиваемого поля (из нескольких), отображаемое дважды после запроса


У меня есть следующий фрагмент кода, который основан на решении этого вопроса:

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

Теперь я получаю список всех терминов в таксономии game, и под каждым термином я получаю название и постоянную ссылку на каждое сообщение, связанное с этим термином. Эта деталь отлично работает.

Проблема в небольшом абзаце, который я хотел бы вернуть под каждым заголовком/ссылкой поста. По какой-то причине он возвращает первое значение в абзаце дважды.

Т.е. для бита кода, который гласит:

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

Если $number = 1, он отобразит 1 (то есть $number), когда он ничего не должен отображать. Если $number = 2, он отобразит 22x (то есть $number . $number . 'x'), когда он должен отображаться 2x.

Если я закомментирую бит кода, полностью используя $number, он вернет 'Array' . $val . ', ', потому что следующий бит кода возвращает массив $val.

Если я закомментирую весь php в этом абзаце, я получу знаменитый белый экран. Предположительно, потому что он пытается отобразить какое-то несуществующее значение.

Изначально я думал, что это может быть ошибка, подобная , описанной здесь, поэтому я установил unset() в разных местах, но это, похоже, не влияет ни на что, отображаемое на сайте.

Возможно, я упускаю что-то очевидное, но я действительно не могу понять, почему он возвращает первое значение. Может ли кто-нибудь обнаружить ошибку в коде?

Author: Community, 2016-02-09

1 answers

Мне удалось это исправить! Как я и подозревал, это не имело никакого отношения к коду, относящемуся к $number, а скорее к вызову echo перед ним.

Мой первоначальный код выглядел так (я пропускаю часть содержимого цикла, чтобы упростить его):

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

Если $number = 1 будет отображаться $number, и если $number > 1) будет отображаться $number . $number . 'x'

Просматривая код здесь некоторое время спустя, я заметил кое-что не так. В моем первом echo вызове я заканчиваю ., поэтому следующий код может быть добавлено в мой абзац. Но, заканчивая абзац, я добавил новый вызов echo вместо того, чтобы следовать коду цикла с . '</p>'.

Что я сделал, чтобы исправить это, так это завершил свой первоначальный вызов echo вместо его продолжения, поэтому, чтобы исправить это, мне нужно было изменить только один символ и удалить пробел в первой строке, так что это выглядит так:

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

Обратите внимание на окончание этого фрагмента кода по сравнению с тем, как он выглядел до того, как я его исправил. Я просто заменил . на ;.

Я недостаточно знаю php, чтобы объяснить это поведение, хотя я предполагаю, что это как-то связано с неправильным завершением/закрытием echo. Если кто-то другой может объяснить более точно, пожалуйста, не стесняйтесь добавлять комментарий, и я соответствующим образом обновлю этот ответ.

 0
Author: rpbtz, 2016-02-16 00:14:31