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

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

新規登録して質問してみよう
ただいま回答率
85.48%
WordPress

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

Q&A

解決済

1回答

1344閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

WordPress

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

0グッド

0クリップ

投稿2018/11/29 09:40

編集2018/12/01 04:43

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

テーマのindex.php

php

1<?php get_header(); ?> 2<div class="container"> 3 <div class="div-content"> 4 <main> 5 <div class="div-post-sort"> 6 <ul class="ul-post-sort"> 7 <li><a href="<?php echo home_url(); ?>">ファン数</a></li> 8 <li><a href="<?php echo home_url()."?order=diff_subsribers"; ?>">急上昇</a></li> 9 <li><a href="<?php echo home_url()."?order=view_count"; ?>">再生回数</a></li> 10 </ul> 11 </div> 12 13 <?php 14 if (isset($_GET["order"]) && $_GET["order"] == "diff_subsribers") : 15 $cat_id = get_cat_ID("diff_subsribers"); 16 $query = new WP_QUERY('cat='.$cat_id); 17 echo "<table><tbody>"; 18 19 if ($query->post_count !== 0) : 20 while ($query->have_posts()) : 21 $query->the_post(); 22 echo "<tr>".the_content()."</tr>"; 23 endwhile; 24 endif; 25 echo "</tbody></table>"; 26 elseif (isset($_GET["order"]) && $_GET["order"] == "view_count") : 27 $cat_id = get_cat_ID("view_counts"); 28 //未実装 29 else : 30 $cat_id = get_cat_ID("subscribers"); 31 32 $query = new WP_QUERY('cat='.$cat_id); 33 echo "<table><tbody>"; 34 var_dump($query->post_count); 35 if ($query->post_count !== 0) : 36 while ($query->have_posts()) : $query->the_post(); 37 echo "<tr>".the_content()."</tr>"; 38 endwhile; 39 endif; 40 echo "</tbody></table>"; 41 /* 42 $posts = get_posts(array( 43 'posts_per_page' => 10, 44 'category' => $cat_id, 45 'order' => 'DESC', 46 'orderby' => 'date' 47 )); 48 var_dump(count($posts)); 49 echo "<table><tbody>"; 50 foreach ($posts as $post) : setup_postdata($post); 51 echo "<tr>".the_content()."</tr>"; 52 endforeach; 53 echo "</tbody></table>"; 54 */ 55 endif; 56 ?> 57 58 <div class="pagination"><?php online_the_posts_pagination(array( 59 'screen_reader_text' => " " 60 )); ?></div> 61 </main> 62 </div> 63</div> 64<?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

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

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

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

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

php

1<?php get_header(); ?> 2<div class="container"> 3 <div class="div-content"> 4 <main> 5 <div class="div-post-sort"> 6 <ul class="ul-post-sort"> 7 <li><a href="<?php echo home_url(); ?>">ファン数</a></li> 8 <li><a href="<?php echo home_url()."?order=diff_subsribers"; ?>">急上昇</a></li> 9 <li><a href="<?php echo home_url()."?order=view_count"; ?>">再生回数</a></li> 10 </ul> 11 </div> 12 13 <?php 14 $paged = (int)(get_query_var('paged')) ? get_query_var('paged') : 1; 15 var_dump($paged); 16 $args = array( 17 'posts_per_page' => 3, 18 'posts_per_archive_page' => 3, 19 'post_type' => 'post', 20 'paged' => $paged, 21 'order' => 'DESC', 22 'orderby' => 'date' 23 ); 24 if (isset($_GET["order"]) && $_GET["order"] == "diff_subsribers") { 25 $args['category_name'] = "diff_subscribers"; 26 $query = new WP_QUERY($args); 27 echo "<table><tbody>"; 28 29 if ($query->post_count !== 0) { 30 while ($query->have_posts()) { 31 $query->the_post(); 32 echo "<tr>".the_content()."</tr>"; 33 } 34 } 35 echo "</tbody></table>"; 36 37 } elseif (isset($_GET["order"]) && $_GET["order"] == "view_count") { 38 $cat_id = get_cat_ID("view_counts"); 39 //未実装 40 } else { 41 $args['category_name'] = "subscribers"; 42 $query = new WP_QUERY($args); 43 echo "<table><tbody>"; 44 if ($query->post_count !== 0) { 45 while ($query->have_posts()) { 46 $query->the_post(); 47 echo "<tr>".the_content()."</tr>"; 48 } 49 } 50 echo "</tbody></table>"; 51 } 52 if ($query->max_num_pages > 1) { 53 $paginate_links = paginate_links(array( 54 'base' => get_pagenum_link(1).'%_%', 55 'format' => '?page=%#%', 56 'current' => max(1, $paged), 57 'total' => $query->max_num_pages, 58 'prev_next' => true, 59 'prev_text' => '前へ', 60 'next_text' => '次へ' 61 )); 62 } 63 wp_reset_postdata(); 64 echo '<div class=""pagination">'; 65 echo $paginate_links; 66 echo '</div>'; 67 ?> 68 </main> 69 </div> 70</div> 71<?php get_footer(); ?>

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

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

html

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

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

html

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

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

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

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

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

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

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

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

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

php

1if ($query->max_num_pages > 1) { 2 $paginate_links = paginate_links(array( 3 'base' => get_pagenum_link(1).'%_%', 4 'format' => $paged_query, 5 'current' => max(1, $paged), 6 'total' => $query->max_num_pages, 7 'prev_next' => true, 8 'prev_text' => '前へ', 9 'next_text' => '次へ' 10 )); 11 }

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

PHP

1 if (isset($_GET["order"]) && $_GET["order"] == "diff_subsribers") : 2 echo "if 1--"; 3 // 略 4 echo "--if 1"; 5 elseif (isset($_GET["order"]) && $_GET["order"] == "view_count") : 6 echo "elseif 1--"; 7 // 略 8 echo "--elseif 1"; 9 else : 10 echo "else 1--"; 11 // 略 12 echo "--else 1"; 13 endif;

投稿2018/11/30 04:23

kei344

総合スコア69407

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/11/30 04:41

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

2018/11/30 04:48

「6個が12個」はページをまたぐ話でしょうか。
退会済みユーザー

退会済みユーザー

2018/11/30 04:52 編集

またいでいます 1ページ目 投稿1 投稿2 投稿3 投稿4 投稿5 投稿6 2ページ目 投稿1 投稿2 投稿3 投稿4 投稿5 投稿6 このように表示されます。
kei344

2018/11/30 14:45

WP_Queryに渡す配列に 'paged' が無いのでページが変わっても最初から始まっていますね。 【【WordPress】WP_Queryでページ送りを実装する方法 | Code Pocket】 http://codepocket.webcrow.jp/2016/04/15/post-25/
退会済みユーザー

退会済みユーザー

2018/12/01 04:44

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問