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 }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/11/30 04:41
2018/11/30 04:48
退会済みユーザー
2018/11/30 04:52 編集
2018/11/30 14:45
退会済みユーザー
2018/12/01 04:44