web-dev-qa-db-ja.com

クエリ後に2回表示された最初のカスタムフィールド値(複数のうち)

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

今、私はgame分類法の全ての用語のリストを得ています、そして各用語の下に、その用語に関連する各投稿へのタイトルとパーマリンクを得ています。この部分はうまくいきます。

問題は、各記事のタイトル/リンクの下に返される小さな段落です。何らかの理由で、段落の最初の値を2回返します。

すなわち読み取るコードビットの場合:

$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()が配置されていますが、影響はないようです。サイトに表示されます。

明らかなものが欠けているかもしれませんが、なぜそれが最初の価値を返しているのか理解できません。誰かがコード内のエラーを見つけることができますか?

1
rpbtz

私はそれを修正することができました!私はそれが$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呼び出しで、私は.で終わりますので、私の段落に次のコードを追加することができます。しかし、段落の最後で、ループコードを. '</p>'でフォローアップする代わりに、新しいecho呼び出しを追加しました。

修正するために行ったのは、最初のecho呼び出しを継続するのではなく終了させることでした。そのため、修正するには1文字を変更し、最初の行のスペースを削除するだけです。

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

私がそれを修正する前にそれがどのように見えたかと比較してそのコードの一部の終わりに注意してください。私は単に.;に置き換えました。

この振る舞いを説明するのに十分なphpはわかりませんが、echoを適切に終了または閉じないことに関係していると思いますが。他の誰かがより正確に説明できる場合は、コメントを追加してください。それに応じてこの回答を更新します。

0
rpbtz