質問編集履歴

12 追記6を追記

退会済みユーザー

退会済みユーザー

2018/12/01 13:43  投稿

wordpressでwp_queryを使うと二重ループになってしまいます
wordpressでデータベースサイトを作っています。
トップページでsubscribersカテゴリの投稿だけを表示させたいのですが、投稿が二重ループになり、本来6個の投稿が12個表示されてしまいます。
二重ループを治すにはどうすればいいですか?
テーマのindex.php
```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
ページネーションの関数に問題があるのかもしれないと思い、ページネーションの部分を
```php
<div class="pagination"><?php the_posts_pagination(array(
               'screen_reader_text' => " "
           )); ?></div>
```
に変えましたが、変化なしです。
追記3
?paged=にどんな数字を入れても1ページ目と同じものが表示されます。
試したこと 4
wordpressの1ページの表示を3で以下のコードで実行ました。
テーマのindex.php
```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ページ目のページネーション
```html
<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ページ目のページネーション
```html
<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になるにはどうすればいいですか?
ページネーションの次へを押したときにURLクエリが?order=diff_subsribers&paged=2になるにはどうすればいいですか?
追記 6
if文の中で`$paged_query = '&paged=%#%'`を追加して、ページネーションの部分を以下のようにすれば意図通りに表示されした。
```php
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' => '次へ'
               ));
           }
```
  • WordPress

    10924 questions

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

11 追記5を追記

退会済みユーザー

退会済みユーザー

2018/12/01 13:33  投稿

wordpressでwp_queryを使うと二重ループになってしまいます
wordpressでデータベースサイトを作っています。
トップページでsubscribersカテゴリの投稿だけを表示させたいのですが、投稿が二重ループになり、本来6個の投稿が12個表示されてしまいます。
二重ループを治すにはどうすればいいですか?
テーマのindex.php
```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
ページネーションの関数に問題があるのかもしれないと思い、ページネーションの部分を
```php
<div class="pagination"><?php the_posts_pagination(array(
               'screen_reader_text' => " "
           )); ?></div>
```
に変えましたが、変化なしです。
追記3
?paged=にどんな数字を入れても1ページ目と同じものが表示されます。
試したこと 4
wordpressの1ページの表示を3で以下のコードで実行ました。
テーマのindex.php
```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ページ目のページネーション
```html
<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ページ目のページネーション
```html
<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をつけた場合は変化なしでした。
`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になるにはどうすればいいですか?
  • WordPress

    10924 questions

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

10 'format'を'?paged=%#%'に変えた場合の結果を追記

退会済みユーザー

退会済みユーザー

2018/12/01 13:20  投稿

wordpressでwp_queryを使うと二重ループになってしまいます
wordpressでデータベースサイトを作っています。
トップページでsubscribersカテゴリの投稿だけを表示させたいのですが、投稿が二重ループになり、本来6個の投稿が12個表示されてしまいます。
二重ループを治すにはどうすればいいですか?
テーマのindex.php
```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
ページネーションの関数に問題があるのかもしれないと思い、ページネーションの部分を
```php
<div class="pagination"><?php the_posts_pagination(array(
               'screen_reader_text' => " "
           )); ?></div>
```
に変えましたが、変化なしです。
追記3
?paged=にどんな数字を入れても1ページ目と同じものが表示されます。
試したこと 4
wordpressの1ページの表示を3で以下のコードで実行ました。
テーマのindex.php
```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ページ目のページネーション
```html
<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ページ目のページネーション
```html
<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)`でした。
`var_dump($paged);`は常に`int(1)`でした。
追記 4
`paginate_links()`の引数の連想配列の'format'を'?paged=%#%'に変えたら、URLクエリをつけない場合は意図通りに表示されましたが、?order=diff_subscribersをつけた場合は変化なしでした。
  • WordPress

    10924 questions

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

9 var_dump($paged)の結果を追記

退会済みユーザー

退会済みユーザー

2018/12/01 13:05  投稿

wordpressでwp_queryを使うと二重ループになってしまいます
wordpressでデータベースサイトを作っています。
トップページでsubscribersカテゴリの投稿だけを表示させたいのですが、投稿が二重ループになり、本来6個の投稿が12個表示されてしまいます。
二重ループを治すにはどうすればいいですか?
テーマのindex.php
```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
ページネーションの関数に問題があるのかもしれないと思い、ページネーションの部分を
```php
<div class="pagination"><?php the_posts_pagination(array(
               'screen_reader_text' => " "
           )); ?></div>
```
に変えましたが、変化なしです。
追記3
?paged=にどんな数字を入れても1ページ目と同じものが表示されます。
試したこと 4
wordpressの1ページの表示を3で以下のコードで実行ました。
テーマのindex.php
```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ページ目のページネーション
```html
<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ページ目のページネーション
```html
<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クエリが長くなっていきます。
という風にURLクエリが長くなっていきます。
`var_dump($paged);`は常に`int(1)`でした。
  • WordPress

    10924 questions

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

8 コードのファイル名を追記

退会済みユーザー

退会済みユーザー

2018/12/01 13:03  投稿

wordpressでwp_queryを使うと二重ループになってしまいます
wordpressでデータベースサイトを作っています。
トップページでsubscribersカテゴリの投稿だけを表示させたいのですが、投稿が二重ループになり、本来6個の投稿が12個表示されてしまいます。
二重ループを治すにはどうすればいいですか?
テーマのindex.php
```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
ページネーションの関数に問題があるのかもしれないと思い、ページネーションの部分を
```php
<div class="pagination"><?php the_posts_pagination(array(
               'screen_reader_text' => " "
           )); ?></div>
```
に変えましたが、変化なしです。
追記3
?paged=にどんな数字を入れても1ページ目と同じものが表示されます。
試したこと 4
wordpressの1ページの表示を3で以下のコードで実行ました。
テーマのindex.php
```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ページ目のページネーション
```html
<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ページ目のページネーション
```html
<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クエリが長くなっていきます。
  • WordPress

    10924 questions

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

7 試したこと4を追記、文字数制限のため試したこと2を削除

退会済みユーザー

退会済みユーザー

2018/12/01 13:00  投稿

wordpressでwp_queryを使うと二重ループになってしまいます
wordpressでデータベースサイトを作っています。
トップページでsubscribersカテゴリの投稿だけを表示させたいのですが、投稿が二重ループになり、本来6個の投稿が12個表示されてしまいます。
二重ループを治すにはどうすればいいですか?
テーマのindex.php
```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)`と表示されました。
試したこと 2
コードを以下のように書き換え、wordpressの設定で1ページに表示する投稿数を30に変更しました。
追記
`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
ページネーションの関数に問題があるのかもしれないと思い、ページネーションの部分を
```php
<div class="pagination"><?php the_posts_pagination(array(
               'screen_reader_text' => " "
           )); ?></div>
```
に変えましたが、変化なしです。
追記3
?paged=にどんな数字を入れても1ページ目と同じものが表示されます。
試したこと 4
wordpressの1ページの表示を3で以下のコードで実行ました。
```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") :
               $args = array(
                   'posts_per_page'  => 30,
                   'post_type' => 'post',
                   'offset' => 0,
                   'category_name' => "diff_subscribers",
                   'order' => 'DESC',
                   'orderby' => 'date'
               );
           $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>";
               
               $query = new WP_QUERY($args);
               echo "<table><tbody>";
               
               if ($query->post_count !== 0) :
                   while ($query->have_posts()) :
               if ($query->post_count !== 0) {
                   while ($query->have_posts()) {
                       $query->the_post();
                       echo "<tr>".the_content()."</tr>";
                   endwhile;
               endif;
               echo "</tbody></table>";
               
               /*
               query_posts('cat='.$cat_id);
               echo "<table><tbody>";
               
               if (have_posts()) :
                   while (have_posts()) : the_post();
                       echo "<tr>".the_content()."</tr>";
                   endwhile;
               endif;
               echo "</tbody></table>";
               */
               /*
               $posts = get_posts(array(
                   'posts_per_page'  => 10,
                   'offset' => 0,
                   'category' => $cat_id,
                   'order' => 'DESC',
                   'orderby' => 'date'
               ));
               
               echo "<table><tbody>";
               foreach ($posts as $post) : setup_postdata($post);
               echo "<tr>".the_content()."</tr>";
               endforeach;
               echo "</tbody></table>";
               */
           elseif (isset($_GET["order"]) && $_GET["order"] == "view_count") :
                   }
               }
               echo "</tbody></table>";
           } elseif (isset($_GET["order"]) && $_GET["order"] == "view_count") {
               $cat_id = get_cat_ID("view_counts");
               //未実装
           else :
               $args = array(
                   'posts_per_page'  => 30,
                   'post_type' => 'post',
                   'offset' => 0,
                   'category_name' => "subscribers",
                   'order' => 'DESC',
                   'orderby' => 'date'
               );
               
               $query = new WP_QUERY($args);
               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;
                   wp_reset_postdata();
               endif;
               echo "</tbody></table>";
               
               /*
               $posts = get_posts($args);
               echo "<table><tbody>";
               foreach ($posts as $post) : setup_postdata($post);
               echo "<tr>".the_content()."</tr>";
               endforeach;
               echo "</tbody></table>";
               */
           endif;
           } 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>';
           ?>
             
             
           <div class="pagination"><?php online_the_posts_pagination(array(  
               'screen_reader_text' => " "  
           )); ?></div>  
             
       </main>
   </div>
</div>
<?php get_footer(); ?>
```
URLに?order=diff_subscribersをつけた時だけ投稿が二重ループするようになりました。
追記
`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
ページネーションの関数に問題があるのかもしれないと思い、ページネーションの部分を
```php
<div class="pagination"><?php the_posts_pagination(array(
               'screen_reader_text' => " "
           )); ?></div>
```
に変えましたが、変化なしです。
追記3
?paged=にどんな数字を入れても1ページ目と同じものが表示されます。
URLクエリがない場合
1ページ目はsubscribersカテゴリの投稿が以下のように表示されます。
投稿1
投稿2
投稿3
1ページ目のページネーション
```html
<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ページ目のページネーション
```html
<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クエリが長くなっていきます。
  • WordPress

    10924 questions

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

6 追記3を追記

退会済みユーザー

退会済みユーザー

2018/11/30 21:31  投稿

wordpressでwp_queryを使うと二重ループになってしまいます
wordpressでデータベースサイトを作っています。
トップページでsubscribersカテゴリの投稿だけを表示させたいのですが、投稿が二重ループになり、本来6個の投稿が12個表示されてしまいます。
二重ループを治すにはどうすればいいですか?
テーマのindex.php
```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)`と表示されました。
試したこと 2
コードを以下のように書き換え、wordpressの設定で1ページに表示する投稿数を30に変更しました。
```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") :
               $args = array(
                   'posts_per_page'  => 30,
                   'post_type' => 'post',
                   'offset' => 0,
                   'category_name' => "diff_subscribers",
                   'order' => 'DESC',
                   'orderby' => 'date'
               );
               
               $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>";
                   endwhile;
               endif;
               echo "</tbody></table>";
               
               /*
               query_posts('cat='.$cat_id);
               echo "<table><tbody>";
               
               if (have_posts()) :
                   while (have_posts()) : the_post();
                       echo "<tr>".the_content()."</tr>";
                   endwhile;
               endif;
               echo "</tbody></table>";
               */
               /*
               $posts = get_posts(array(
                   'posts_per_page'  => 10,
                   'offset' => 0,
                   'category' => $cat_id,
                   'order' => 'DESC',
                   'orderby' => 'date'
               ));
               
               echo "<table><tbody>";
               foreach ($posts as $post) : setup_postdata($post);
               echo "<tr>".the_content()."</tr>";
               endforeach;
               echo "</tbody></table>";
               */
           elseif (isset($_GET["order"]) && $_GET["order"] == "view_count") :
               $cat_id = get_cat_ID("view_counts");
               //未実装
           else :
               $args = array(
                   'posts_per_page'  => 30,
                   'post_type' => 'post',
                   'offset' => 0,
                   'category_name' => "subscribers",
                   'order' => 'DESC',
                   'orderby' => 'date'
               );
               
               $query = new WP_QUERY($args);
               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;
                   wp_reset_postdata();
               endif;
               echo "</tbody></table>";
               
               /*
               $posts = get_posts($args);
               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(); ?>
```
URLに?order=diff_subscribersをつけた時だけ投稿が二重ループするようになりました。
追記
`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
ページネーションの関数に問題があるのかもしれないと思い、ページネーションの部分を
```php
<div class="pagination"><?php the_posts_pagination(array(
               'screen_reader_text' => " "
           )); ?></div>
```
に変えましたが、変化なしです。
に変えましたが、変化なしです。
追記3
?paged=にどんな数字を入れても1ページ目と同じものが表示されます。
  • WordPress

    10924 questions

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

5 文を見やすく修正

退会済みユーザー

退会済みユーザー

2018/11/30 15:05  投稿

wordpressでwp_queryを使うと二重ループになってしまいます
wordpressでデータベースサイトを作っています。
トップページでsubscribersカテゴリの投稿だけを表示させたいのですが、投稿が二重ループになり、本来6個の投稿が12個表示されてしまいます。
二重ループを治すにはどうすればいいですか?
テーマのindex.php
```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)と表示されました。
`var_dump($query->post_count)`と`var_dump(count($posts))`は`int(6)`と表示されました。
試したこと 2
コードを以下のように書き換え、wordpressの設定で1ページに表示する投稿数を30に変更しました。
```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") :
               $args = array(
                   'posts_per_page'  => 30,
                   'post_type' => 'post',
                   'offset' => 0,
                   'category_name' => "diff_subscribers",
                   'order' => 'DESC',
                   'orderby' => 'date'
               );
               
               $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>";
                   endwhile;
               endif;
               echo "</tbody></table>";
               
               /*
               query_posts('cat='.$cat_id);
               echo "<table><tbody>";
               
               if (have_posts()) :
                   while (have_posts()) : the_post();
                       echo "<tr>".the_content()."</tr>";
                   endwhile;
               endif;
               echo "</tbody></table>";
               */
               /*
               $posts = get_posts(array(
                   'posts_per_page'  => 10,
                   'offset' => 0,
                   'category' => $cat_id,
                   'order' => 'DESC',
                   'orderby' => 'date'
               ));
               
               echo "<table><tbody>";
               foreach ($posts as $post) : setup_postdata($post);
               echo "<tr>".the_content()."</tr>";
               endforeach;
               echo "</tbody></table>";
               */
           elseif (isset($_GET["order"]) && $_GET["order"] == "view_count") :
               $cat_id = get_cat_ID("view_counts");
               //未実装
           else :
               $args = array(
                   'posts_per_page'  => 30,
                   'post_type' => 'post',
                   'offset' => 0,
                   'category_name' => "subscribers",
                   'order' => 'DESC',
                   'orderby' => 'date'
               );
               
               $query = new WP_QUERY($args);
               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;
                   wp_reset_postdata();
               endif;
               echo "</tbody></table>";
               
               /*
               $posts = get_posts($args);
               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(); ?>
```
URLに?order=diff_subscribersをつけた時だけ投稿が二重ループするようになりました。
追記
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ページ目と同じものが表示されます。
`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ページ目のリンクは表示されず、意図通りに表示されます。
`$args`の`'posts_per_page'`を30、wordpressの1ページの表示する投稿数を30の時は2ページ目のリンクは表示されず、意図通りに表示されます。
試したこと 3
ページネーションの関数に問題があるのかもしれないと思い、ページネーションの部分を
```php
<div class="pagination"><?php the_posts_pagination(array(
               'screen_reader_text' => " "
           )); ?></div>
```
に変えましたが、変化なしです。
  • WordPress

    10924 questions

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

4 試した

退会済みユーザー

退会済みユーザー

2018/11/30 13:50  投稿

wordpressでwp_queryを使うと二重ループになってしまいます
wordpressでデータベースサイトを作っています。
トップページでsubscribersカテゴリの投稿だけを表示させたいのですが、投稿が二重ループになり、本来6個の投稿が12個表示されてしまいます。
二重ループを治すにはどうすればいいですか?
テーマのindex.php
```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)と表示されました。
試したこと 2
コードを以下のように書き換え、wordpressの設定で1ページに表示する投稿数を30に変更しました。
```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") :
               $args = array(
                   'posts_per_page'  => 30,
                   'post_type' => 'post',
                   'offset' => 0,
                   'category_name' => "diff_subscribers",
                   'order' => 'DESC',
                   'orderby' => 'date'
               );
               
               $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>";
                   endwhile;
               endif;
               echo "</tbody></table>";
               
               /*
               query_posts('cat='.$cat_id);
               echo "<table><tbody>";
               
               if (have_posts()) :
                   while (have_posts()) : the_post();
                       echo "<tr>".the_content()."</tr>";
                   endwhile;
               endif;
               echo "</tbody></table>";
               */
               /*
               $posts = get_posts(array(
                   'posts_per_page'  => 10,
                   'offset' => 0,
                   'category' => $cat_id,
                   'order' => 'DESC',
                   'orderby' => 'date'
               ));
               
               echo "<table><tbody>";
               foreach ($posts as $post) : setup_postdata($post);
               echo "<tr>".the_content()."</tr>";
               endforeach;
               echo "</tbody></table>";
               */
           elseif (isset($_GET["order"]) && $_GET["order"] == "view_count") :
               $cat_id = get_cat_ID("view_counts");
               //未実装
           else :
               $args = array(
                   'posts_per_page'  => 30,
                   'post_type' => 'post',
                   'offset' => 0,
                   'category_name' => "subscribers",
                   'order' => 'DESC',
                   'orderby' => 'date'
               );
               
               $query = new WP_QUERY($args);
               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;
                   wp_reset_postdata();
               endif;
               echo "</tbody></table>";
               
               /*
               $posts = get_posts($args);
               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(); ?>
```
URLに?order=diff_subscribersをつけた時だけ投稿が二重ループするようになりました。
追記
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ページ目のリンクは表示されず、意図通りに表示されます。
$argsの'posts_per_page'を30、wordpressの1ページの表示する投稿数を30の時は2ページ目のリンクは表示されず、意図通りに表示されます。
試したこと 3
ページネーションの関数に問題があるのかもしれないと思い、ページネーションの部分を
```php
<div class="pagination"><?php the_posts_pagination(array(
               'screen_reader_text' => " "
           )); ?></div>
```
に変えましたが、変化なしです。
  • WordPress

    10924 questions

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

3 追記2を追記

退会済みユーザー

退会済みユーザー

2018/11/30 13:43  投稿

wordpressでwp_queryを使うと二重ループになってしまいます
wordpressでデータベースサイトを作っています。
トップページでsubscribersカテゴリの投稿だけを表示させたいのですが、投稿が二重ループになり、本来6個の投稿が12個表示されてしまいます。
二重ループを治すにはどうすればいいですか?
テーマのindex.php
```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)と表示されました。
試したこと 2
コードを以下のように書き換え、wordpressの設定で1ページに表示する投稿数を30に変更しました。
```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") :
               $args = array(
                   'posts_per_page'  => 30,
                   'post_type' => 'post',
                   'offset' => 0,
                   'category_name' => "diff_subscribers",
                   'order' => 'DESC',
                   'orderby' => 'date'
               );
               
               $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>";
                   endwhile;
               endif;
               echo "</tbody></table>";
               
               /*
               query_posts('cat='.$cat_id);
               echo "<table><tbody>";
               
               if (have_posts()) :
                   while (have_posts()) : the_post();
                       echo "<tr>".the_content()."</tr>";
                   endwhile;
               endif;
               echo "</tbody></table>";
               */
               /*
               $posts = get_posts(array(
                   'posts_per_page'  => 10,
                   'offset' => 0,
                   'category' => $cat_id,
                   'order' => 'DESC',
                   'orderby' => 'date'
               ));
               
               echo "<table><tbody>";
               foreach ($posts as $post) : setup_postdata($post);
               echo "<tr>".the_content()."</tr>";
               endforeach;
               echo "</tbody></table>";
               */
           elseif (isset($_GET["order"]) && $_GET["order"] == "view_count") :
               $cat_id = get_cat_ID("view_counts");
               //未実装
           else :
               $args = array(
                   'posts_per_page'  => 30,
                   'post_type' => 'post',
                   'offset' => 0,
                   'category_name' => "subscribers",
                   'order' => 'DESC',
                   'orderby' => 'date'
               );
               
               $query = new WP_QUERY($args);
               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;
                   wp_reset_postdata();
               endif;
               echo "</tbody></table>";
               
               /*
               $posts = get_posts($args);
               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(); ?>
```
URLに?order=diff_subscribersをつけた時だけ投稿が二重ループするようになりました。
追記
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ページ目と同じものが表示されます。
ただ、$argsの'posts_per_page'を10、wordpressの1ページの表示する投稿数を10にすると?order=diff_subscribersをつけてもつけなくてもページネーションで2ページ目のリンクが表示され、クリックすると1ページ目と同じものが表示されます。
追記2
$argsの'posts_per_page'を30、wordpressの1ページの表示する投稿数を30の時は2ページ目のリンクは表示されず、意図通りに表示されます。
  • WordPress

    10924 questions

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

2 コードの修正と追記

退会済みユーザー

退会済みユーザー

2018/11/30 13:37  投稿

wordpressでwp_queryを使うと二重ループになってしまいます
wordpressでデータベースサイトを作っています。
トップページでsubscribersカテゴリの投稿だけを表示させたいのですが、投稿が二重ループになり、本来6個の投稿が12個表示されてしまいます。
二重ループを治すにはどうすればいいですか?
テーマのindex.php
```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)と表示されました。
試したこと 2
コードを以下のように書き換え、wordpressの設定で1ページに表示する投稿数を30に変更しました。
```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") :
               $args = array(
                   'posts_per_page'  => 30,
                   'post_type' => 'post',
                   'offset' => 0,
                   'category_name' => "diff_subscribers",
                   'order' => 'DESC',
                   'orderby' => 'date'
               );
               
               $query = new WP_QUERY('cat='.$cat_id);
               $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>";
                   endwhile;
               endif;
               echo "</tbody></table>";
               
               /*
               query_posts('cat='.$cat_id);
               echo "<table><tbody>";
               
               if (have_posts()) :
                   while (have_posts()) : the_post();
                       echo "<tr>".the_content()."</tr>";
                   endwhile;
               endif;
               echo "</tbody></table>";
               */
               /*
               $posts = get_posts(array(
                   'posts_per_page'  => 10,
                   'offset' => 0,
                   'category' => $cat_id,
                   'order' => 'DESC',
                   'orderby' => 'date'
               ));
               
               echo "<table><tbody>";
               foreach ($posts as $post) : setup_postdata($post);
               echo "<tr>".the_content()."</tr>";
               endforeach;
               echo "</tbody></table>";
               */
           elseif (isset($_GET["order"]) && $_GET["order"] == "view_count") :
               $cat_id = get_cat_ID("view_counts");
               //未実装
           else :
               $args = array(
                   'posts_per_page'  => 30,
                   'post_type' => 'post',
                   'offset' => 0,
                   'category_name' => "subscribers",
                   'order' => 'DESC',
                   'orderby' => 'date'
               );
               
               $query = new WP_QUERY($args);
               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;
                   wp_reset_postdata();
               endif;
               echo "</tbody></table>";
               
               /*
               $posts = get_posts($args);
               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(); ?>
```
URLに?order=diff_subscribersをつけた時だけ投稿が二重ループするようになりました。
URLに?order=diff_subscribersをつけた時だけ投稿が二重ループするようになりました。
追記
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ページ目と同じものが表示されます。
  • WordPress

    10924 questions

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

1 試したことを追記

退会済みユーザー

退会済みユーザー

2018/11/30 13:13  投稿

wordpressでwp_queryを使うと二重ループになってしまいます
wordpressでデータベースサイトを作っています。
トップページでsubscribersカテゴリの投稿だけを表示させたいのですが、投稿が二重ループになり、本来6個の投稿が12個表示されてしまいます。
二重ループを治すにはどうすればいいですか?
テーマのindex.php
```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)と表示されました。
var_dump($query->post_count)とvar_dump(count($posts))はint(6)と表示されました。
試したこと 2
コードを以下のように書き換え、wordpressの設定で1ページに表示する投稿数を30に変更しました。
```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") :
               $args = array(
                   'posts_per_page'  => 30,
                   'post_type' => 'post',
                   'offset' => 0,
                   'category_name' => "diff_subscribers",
                   'order' => 'DESC',
                   'orderby' => 'date'
               );
               
               $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>";
               
               /*
               query_posts('cat='.$cat_id);
               echo "<table><tbody>";
               
               if (have_posts()) :
                   while (have_posts()) : the_post();
                       echo "<tr>".the_content()."</tr>";
                   endwhile;
               endif;
               echo "</tbody></table>";
               */
               /*
               $posts = get_posts(array(
                   'posts_per_page'  => 10,
                   'offset' => 0,
                   'category' => $cat_id,
                   'order' => 'DESC',
                   'orderby' => 'date'
               ));
               
               echo "<table><tbody>";
               foreach ($posts as $post) : setup_postdata($post);
               echo "<tr>".the_content()."</tr>";
               endforeach;
               echo "</tbody></table>";
               */
           elseif (isset($_GET["order"]) && $_GET["order"] == "view_count") :
               $cat_id = get_cat_ID("view_counts");
               //未実装
           else :
               $args = array(
                   'posts_per_page'  => 30,
                   'post_type' => 'post',
                   'offset' => 0,
                   'category_name' => "subscribers",
                   'order' => 'DESC',
                   'orderby' => 'date'
               );
               
               $query = new WP_QUERY($args);
               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;
                   wp_reset_postdata();
               endif;
               echo "</tbody></table>";
               
               /*
               $posts = get_posts($args);
               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(); ?>
```
URLに?order=diff_subscribersをつけた時だけ投稿が二重ループするようになりました。
  • WordPress

    10924 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る