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

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

ただいまの
回答率

90.51%

  • WordPress

    8927questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

wordpressでwp_queryを使うと二重ループになってしまいます

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 225
退会済みユーザー

退会済みユーザー

wordpressでデータベースサイトを作っています。
トップページでsubscribersカテゴリの投稿だけを表示させたいのですが、投稿が二重ループになり、本来6個の投稿が12個表示されてしまいます。
二重ループを治すにはどうすればいいですか?

テーマのindex.php

<?php get_header(); ?>
<div class="container">
    <div class="div-content">
        <main>
            <div class="div-post-sort">
                <ul class="ul-post-sort">
                <li><a href="<?php echo home_url(); ?>">ファン数</a></li>
                <li><a href="<?php echo home_url()."?order=diff_subsribers"; ?>">急上昇</a></li>
                <li><a href="<?php echo home_url()."?order=view_count"; ?>">再生回数</a></li>
                </ul>
            </div>

            <?php
            if (isset($_GET["order"]) && $_GET["order"] == "diff_subsribers") :
                $cat_id = get_cat_ID("diff_subsribers");
                $query = new WP_QUERY('cat='.$cat_id); 
                echo "<table><tbody>";

                if ($query->post_count !== 0) :
                    while ($query->have_posts()) :
                        $query->the_post();
                        echo "<tr>".the_content()."</tr>";
                    endwhile;
                endif;
                echo "</tbody></table>";
            elseif (isset($_GET["order"]) && $_GET["order"] == "view_count") :
                $cat_id = get_cat_ID("view_counts");
                //未実装
            else :
                $cat_id = get_cat_ID("subscribers");

                $query = new WP_QUERY('cat='.$cat_id); 
                echo "<table><tbody>";
                var_dump($query->post_count);
                if ($query->post_count !== 0) :
                    while ($query->have_posts()) : $query->the_post();
                        echo "<tr>".the_content()."</tr>";
                    endwhile;
                endif;
                echo "</tbody></table>";
                /*
                $posts = get_posts(array(
                    'posts_per_page'   => 10,
                    'category' => $cat_id,
                    'order' => 'DESC',
                    'orderby' => 'date'
                ));
                var_dump(count($posts));
                echo "<table><tbody>";
                foreach ($posts as $post) : setup_postdata($post);
                echo "<tr>".the_content()."</tr>";
                endforeach;
                echo "</tbody></table>";
                */
            endif;
            ?>

            <div class="pagination"><?php online_the_posts_pagination(array(
                'screen_reader_text' => " "
            )); ?></div>
        </main>
    </div>
</div>
<?php get_footer(); ?>

試したこと 1
コードのコメントアウトに書いてある通り、get_postsを使ったループも試してみましたが、こちらも二重ループになってしまいます。
var_dump($query->post_count)var_dump(count($posts))int(6)と表示されました。

追記
if (isset($_GET["order"]) && $_GET["order"] == "diff_subsribers") :の中のコードが間違っていました。
誤 $query = new WP_QUERY('cat='.$cat_id); 
正 $query = new WP_QUERY($args);
ただ、$args'posts_per_page'を10、wordpressの1ページの表示する投稿数を10にすると?order=diff_subscribersをつけてもつけなくてもページネーションで2ページ目のリンクが表示され、クリックすると1ページ目と同じものが表示されます。
追記2
$args'posts_per_page'を30、wordpressの1ページの表示する投稿数を30の時は2ページ目のリンクは表示されず、意図通りに表示されます。

試したこと 3
ページネーションの関数に問題があるのかもしれないと思い、ページネーションの部分を

<div class="pagination"><?php the_posts_pagination(array(
                'screen_reader_text' => " "
            )); ?></div>


に変えましたが、変化なしです。

追記3
?paged=にどんな数字を入れても1ページ目と同じものが表示されます。

試したこと 4
wordpressの1ページの表示を3で以下のコードで実行ました。
テーマのindex.php

<?php get_header(); ?>
<div class="container">
    <div class="div-content">
        <main>
            <div class="div-post-sort">
                <ul class="ul-post-sort">
                <li><a href="<?php echo home_url(); ?>">ファン数</a></li>
                <li><a href="<?php echo home_url()."?order=diff_subsribers"; ?>">急上昇</a></li>
                <li><a href="<?php echo home_url()."?order=view_count"; ?>">再生回数</a></li>
                </ul>
            </div>

            <?php
            $paged = (int)(get_query_var('paged')) ? get_query_var('paged') : 1;
            var_dump($paged);
            $args = array(
                'posts_per_page'   => 3,
                'posts_per_archive_page' => 3,
                'post_type' => 'post',
                'paged' => $paged,
                'order' => 'DESC',
                'orderby' => 'date'
            );
            if (isset($_GET["order"]) && $_GET["order"] == "diff_subsribers") {
                $args['category_name'] = "diff_subscribers";
                $query = new WP_QUERY($args); 
                echo "<table><tbody>";

                if ($query->post_count !== 0) {
                    while ($query->have_posts()) {
                        $query->the_post();
                        echo "<tr>".the_content()."</tr>";
                    }
                }
                echo "</tbody></table>";

            } elseif (isset($_GET["order"]) && $_GET["order"] == "view_count") {
                $cat_id = get_cat_ID("view_counts");
                //未実装
            } else {
                $args['category_name'] = "subscribers";
                $query = new WP_QUERY($args);
                echo "<table><tbody>";
                if ($query->post_count !== 0) {
                    while ($query->have_posts()) {
                        $query->the_post();
                        echo "<tr>".the_content()."</tr>";
                    }
                }
                echo "</tbody></table>";   
            }
            if ($query->max_num_pages > 1) {
                $paginate_links = paginate_links(array(
                    'base' => get_pagenum_link(1).'%_%',
                    'format' => '?page=%#%',
                    'current' => max(1, $paged),
                    'total' => $query->max_num_pages,
                    'prev_next' => true,
                    'prev_text' => '前へ',
                    'next_text' => '次へ'
                ));
            } 
            wp_reset_postdata();
            echo '<div class=""pagination">';
            echo $paginate_links;
            echo '</div>';
            ?>
        </main>
    </div>
</div>
<?php get_footer(); ?>

URLクエリがない場合
1ページ目はsubscribersカテゴリの投稿が以下のように表示されます。
投稿1
投稿2
投稿3

1ページ目のページネーション

<div class="pagination">
<span aria-current='page' class='page-numbers current'>1</span>
<a class='page-numbers' href='http://localhost/TestPHP/ASMRrank/wordpress/?page=2'>2</a>
<a class="next page-numbers" href="http://localhost/TestPHP/ASMRrank/wordpress/?page=2">次へ</a></div>

2ページ目の投稿は1ページ目と同じ投稿が表示されます。
2ページ目のページネーション

<div class="pagination">
<span aria-current='page' class='page-numbers current'>1</span>
<a class='page-numbers' href='http://localhost/TestPHP/ASMRrank/wordpress/?page=2?page=2'>2</a>
<a class="next page-numbers" href="http://localhost/TestPHP/ASMRrank/wordpress/?page=2?page=2">次へ</a></div> 


2ページ目で次へを押すと?page=2?page=2
もう一度押すと?page=2%3Fpage%3D2?page=2
もう一度押すと?page=2%3Fpage%3D2%3Fpage%3D2?page=2
という風にURLクエリが長くなっていきます。

URLクエリがorder=diff_subscribersの場合
1ページ目はsubscribersカテゴリの投稿が以下のように表示されます。
投稿1
投稿2
投稿3

ページネーションの次へを押すとsubsribersカテゴリの
投稿1
投稿2
投稿3
が表示されます。

次へを押すごとに
?order=diff_subsribers?page=2
?order=diff_subsribers%3Fpage%3D2?page=2
?order=diff_subsribers%3Fpage%3D2%3Fpage%3D2?page=2
という風にURLクエリが長くなっていきます。

var_dump($paged);は常にint(1)でした。

追記 4
paginate_links()の引数の連想配列の'format'を'?paged=%#%'に変えたら、URLクエリをつけない場合は意図通りに表示されましたが、?order=diff_subscribersをつけた場合は変化なしでした。

追記 5
URLクエリが?order=diff_subsribersの場合に、ページネーションの次へを押すとURLクエリが?order=diff_subsribers?paged=2になっていました。
試しに手入力でURLクエリを?order=diff_subsribers&paged=2にしてみたら、意図通りに表示されました。
ページネーションの次へを押したときにURLクエリが?order=diff_subsribers&paged=2になるにはどうすればいいですか?

追記 6
if文の中で$paged_query = '&paged=%#%'を追加して、ページネーションの部分を以下のようにすれば意図通りに表示されした。

if ($query->max_num_pages > 1) {
                $paginate_links = paginate_links(array(
                    'base' => get_pagenum_link(1).'%_%',
                    'format' => $paged_query,
                    'current' => max(1, $paged),
                    'total' => $query->max_num_pages,
                    'prev_next' => true,
                    'prev_text' => '前へ',
                    'next_text' => '次へ'
                ));
            } 
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

とりあえずどこが表示されているかを特定してみては。

            if (isset($_GET["order"]) && $_GET["order"] == "diff_subsribers") :
                echo "if 1--";
                // 略
                echo "--if 1";
            elseif (isset($_GET["order"]) && $_GET["order"] == "view_count") :
                echo "elseif  1--";
                // 略
                echo "--elseif  1";
            else :
                echo "else  1--";
                // 略
                echo "--else  1";
            endif;

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/11/30 13:41

    if (isset($_GET["order"]) && $_GET["order"] == "diff_subsribers") :にはdiff_subscribersカテゴリの投稿6個、2ページ目には1ページ目と同じものが表示されます。
    else :にはsubscirbersカテゴリの投稿カテゴリの投稿6個、2ページ目には1ページ目と同じものが表示されます。

    diff_subscribers、subscribersの投稿数は6個ずつです。

    キャンセル

  • 2018/11/30 13:48

    「6個が12個」はページをまたぐ話でしょうか。

    キャンセル

  • 2018/11/30 13:51 編集

    またいでいます
    1ページ目
    投稿1
    投稿2
    投稿3
    投稿4
    投稿5
    投稿6
    2ページ目
    投稿1
    投稿2
    投稿3
    投稿4
    投稿5
    投稿6

    このように表示されます。

    キャンセル

  • 2018/11/30 23:45

    WP_Queryに渡す配列に 'paged' が無いのでページが変わっても最初から始まっていますね。

    【【WordPress】WP_Queryでページ送りを実装する方法 | Code Pocket】
    http://codepocket.webcrow.jp/2016/04/15/post-25/

    キャンセル

  • 2018/12/01 13:44

    解決しました!ありがとうございます!

    キャンセル

同じタグがついた質問を見る

  • WordPress

    8927questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。