実現したいこと
タームで絞り込みをかけた際、そのタームが有する記事よりも多くのページが生成されてしまう。
ページャーを、出力されている記事数分だけ生成させたい。
前提
2つの投稿タイプで同一のタクソノミーを利用しており、下記のような構造になっています。
カスタム投稿タイプ
├ NEWS
└ SHOP
共通タクソノミー
items
├ items1
├ items2
├ items3
└ items4
タクソノミーは1つのためtaxonomy.phpのみ用意し、
タームで絞り込んだ時にURLに「news」が含まれていたら NEWS用のテンプレートcontent-news.phpを読み込み、
「shop」が含まれていたら テンプレートcontent-shop.phpを読み込むように条件分岐しています。
起きている問題
ターム一覧ではそれぞれの投稿タイプの記事を取得できるのですが、ページャーが投稿タイプNEWSとSHOPの合算された記事分生成されます。
ターム「items1」で例にすると、
NEWSで3記事、SHOPで10記事を有しているとします。
NEWSアーカイブページ(archive-news.php)
→ item1で絞り込み(taxonomy.php内でcontent-news.phpを読み込み)
→ item1のNEWSアーカイブページ
上記のitem1のNEWSアーカイブページで、
1ページに最大5記事まで出力される場合、本来であればページャーは生成されないはずですが、
3ページ分のページャーが生成されてしまいます。
ちなみに記事は3記事のみが表示され、2ページ目以降は記事はなしでページャーのみが存在する状態です。
恐らく、数的にNEWSとSHOPを分別できずに合わさった分が生成されているのではないかと思います。
該当のソースコード
ページャーの部分(functions.phpとcontent-news.php)、記事出力部分(content-news.php)のコードは以下です。
php
1//functions.php 2<?php 3function pagination( $pages, $paged, $range = 2, $show_only = false ) { 4 $pages = ( int ) $pages; 5 $paged = $paged ?: 1; 6 $text_first = "<<"; 7 $text_before = "<"; 8 $text_next = ">"; 9 $text_last = ">>"; 10 if ( $show_only && $pages === 1 ) { 11 echo '<div class="pager"><ul class="pager-list"><li><a class="current" href="">1</a></li></ul></div>'; 12 return; 13 } 14 if ( $pages === 1 ) return; // 1ページのみで表示設定もない場合 15 if ( 1 !== $pages ) { 16 //2ページ以上の時 17 echo '<div class="pager"><ul class="pager-list">'; 18 // echo '<div class="pagination"><span class="page_num">Page ', $paged ,' of ', $pages ,'</span>'; 19 //現在のページ数などを表示する場合はこの上のコメントアウトを外す。 20 if ( $paged > $range + 1 ) { 21 // 「最初へ」 の表示 22 echo '<li class="prev-area"><a href="', get_pagenum_link(1) ,'" class="prev">', $text_first ,'</a></li>'; 23 } 24 if ( $paged > 1 ) { 25 // 「前へ」 の表示 26 echo '<li class="prev-area"><a href="', get_pagenum_link( $paged - 1 ) ,'" class="prev">', $text_before ,'</a></li>'; 27 } 28 for ( $i = 1; $i <= $pages; $i++ ) { 29 if ( $i <= $paged + $range && $i >= $paged - $range ) { 30 // $paged +- $range 以内であればページ番号を出力 31 if ( $paged === $i ) { 32 echo '<li><a class="current" href="">', $i ,'</a></li>'; 33 } else { 34 echo '<li><a href="', get_pagenum_link( $i ) ,'">', $i ,'</a></li>'; 35 } 36 } 37 } 38 if ( $paged < $pages ) { 39 // 「次へ」 の表示 40 echo '<li class="next-area"><a href="', get_pagenum_link( $paged + 1 ) ,'" class="next">', $text_next ,'</a></li>'; 41 } 42 if ( $paged + $range < $pages ) { 43 // 「最後へ」 の表示 44 echo '<li class="next-area"><a href="', get_pagenum_link( $pages ) ,'" class="next">', $text_last ,'</a></li>'; 45 } 46 echo '</ul></div>'; 47 } 48} 49?> 50
php
1//content-news.php(taxonomy.phpでインクルードしている) 2 <ul> 3 <?php 4 $paged = get_query_var('paged') ? get_query_var('paged') : 1 ; 5 $term = wp_get_object_terms($post->ID, 'items'); 6 $args = array( 7 'post_type' => 'news', 8 'taxonomy' => 'items', 9 'term' => $term[0]->slug, 10 'posts_per_page' => 5, 11 'paged' => $paged 12 ); 13 $custom_query = new WP_Query( $args ); 14 if ( $custom_query->have_posts() ) : 15 while ( $custom_query->have_posts() ) : 16 $custom_query->the_post(); 17 ?> 18 <!-- ▽ ループ開始 ▽ --> 19 <li> 20 記事内容 21 </li> 22 <!-- △ ループ終了 △ --> 23 24 <?php endwhile; 25 endif; 26 wp_reset_postdata(); 27 ?> 28 </ul> 29 <!-- ページネーション --> 30 <?php 31 if ( function_exists( 'pagination' ) ) : 32 pagination( $wp_query->max_num_pages, get_query_var( 'paged' ) ); 33 endif; 34 ?>
ちなみに、content-shop.phpも上記のcontent-news.phpと構造はほぼ同じです。
調べてもわからず、お力添えを願います。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/24 01:20