質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.02%

PHPのループforeachの表示がリセットされません。ループ処理に詳しい方お願いします。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,081

musashidayo

score 34

'関連A'というカスタムフィールドに入っているpostをforeachでループさせてる中で、'関連B'というカスタムフィールドにも属していた場合に何番目かという処理を書いたのですが、値が入っていないpostのときにも、その一個前の値が反映されてしまい、うまく機能しません。

<ul>
        <?php
            $page = get_page_by_path('関連Aの固定ページ');
            $my_ranking = get_field('関連A',$page->ID);
            if ( $my_ranking ) {
            $number = 1;
            global $wpdb;
            global $rateAvg;            
        ?>
        <?php 
            foreach($my_ranking as $value){
                if ( $number >= 11){
                break; 
                }
                setup_postdata($value);
        ?>
            <?php
                $ID = $value->ID;                    
                $rateQuery = "
                                SELECT
                                    AVG(meta_all.meta_value) AS avg
                                FROM
                                    (
                                        SELECT
                                            meta.meta_value
                                        FROM
                                            (
                                                SELECT
                                                    comment_ID,
                                                    comment_post_ID
                                                FROM
                                                    wp_comments
                                                WHERE
                                                    comment_approved = 1
                                                    AND
                                                        comment_post_ID = ".$ID."
                                            ) comment,
                                            (
                                                SELECT
                                                    comment_ID,
                                                    meta_value
                                                FROM
                                                    wp_commentmeta
                                                WHERE
                                                    meta_value is not null
                                            ) meta
                                        WHERE
                                            comment.comment_ID = meta.comment_ID
                                    ) meta_all;
                            ";
                $rateAvg = $wpdb->get_results($rateQuery);
            ?>
            <li>
                    <a href="<?php the_permalink($value->ID); ?>">
                        <?php echo get_the_title($value->ID); ?>
                    </a>
                        <?php echo get_the_post_thumbnail($value->ID); ?>
                                    <?php 
                                        $ppage = get_page_by_path( '関連Bの固定ページ' );
                                        $site_list = get_field('関連B',$ppage->ID);
                                        $i = 1;
                                        if ( $site_list) {

                                            foreach ($site_list as $vvalue){
                                                $ss = $vvalue -> ID;
                                                if ( $ID == $ss ) { 
                                                    echo $i++."位";
                                                    break;
                                                }
                                                $i++;
                                                if(!($site_list[$i])){
                                                    echo "圏外";
                                                    break;
                                                }

                                    ?>
                                    <?php } wp_reset_postdata();} ?>
             <!--ここに'関連A'のポストの内容を再度用いて表示する内容が入る-->
    <?php wp_reset_postdata(); ?>
    <?php $number++;}}?>
       </li>
    </ul>


元々あった内容に真ん中の「$ppage〜break;」の部分を入れ子にしている形なのが原因だとは思われるのですが、ループ処理に詳しい方のご指導お願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2018/02/14 09:34

    質問テンプレートにそって書くことで質問内容を整理されるよう強くすすめます。

    キャンセル

  • m.ts10806

    2018/02/14 09:36

    asahina1979 さん if($myranking)の閉じ部分探すのに数分かかりましたね。。結局コードコピペしてフォーマッターにかけましたが

    キャンセル

  • miz

    2018/02/15 21:42

    ひとつめのwp_reset_postdataが余計ではないでしょうか。

    キャンセル

回答 1

checkベストアンサー

+3

コード読んでないです。質問内容に対しての勘です

値が入っていないpostのときにも、その一個前の値が反映されてしまい、うまく機能しません。

よくあるのは、値の初期化忘れです。
ループの頭で初期化して、ループの中で値を入れるようにすると、一つ前の値が入るといったことはなくなります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/16 12:52

    ループ毎に一つ一つ初期化していったらしっかりと表示されるようになりました。ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.02%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる