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

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

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

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

ページネーション

Webアプリケーションにおいて、1ページに収まらないコンテンツを、各ページへのリンクを並べてアクセスしやすくする手法をページネーションと呼びます。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

1973閲覧

WP ページャーが出力記事よりも多く生成されてしまうのを直したい

ztj

総合スコア14

WordPress

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

ページネーション

Webアプリケーションにおいて、1ページに収まらないコンテンツを、各ページへのリンクを並べてアクセスしやすくする手法をページネーションと呼びます。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2021/03/23 04:21

実現したいこと

タームで絞り込みをかけた際、そのタームが有する記事よりも多くのページが生成されてしまう。
ページャーを、出力されている記事数分だけ生成させたい。

前提

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と構造はほぼ同じです。
調べてもわからず、お力添えを願います。

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

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

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

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

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

guest

回答2

0

ベストアンサー

$custom_query で、サブループを使って投稿を表示されていますが、ページネーションだけ、$wp_query なのは何故でしょうか?

投稿2021/03/23 21:23

CHERRY

総合スコア25171

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

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

ztj

2021/03/24 01:20

ご回答ありがとうございます。 恥ずかしながらメインループ・サブループについて深く理解していなく、 ページャーもほぼコピペで作成したものでした。 ご指摘いただいたページャー部分の $wp_query を $custom_query に変更したら正常に生成されるようになりました。 <?php if ( function_exists( 'pagination' ) ) : pagination( $custom_query->max_num_pages, get_query_var( 'paged' ) ); endif; ?> サブループ等について、もっと勉強して参ります。 ご教授いただきありがとうございました!
guest

0

ここが問題っぽいです

PHP

1<?php 2 if ( function_exists( 'pagination' ) ) : 3 pagination( $wp_query->max_num_pages, get_query_var( 'paged' ) ); 4 endif; 5

max_num_pagesだと共通テーブルの最大値を取得することになるので、タクソノミーごとの件数を取得するようにしましょう。ここが参考になるかと。

WPのカスタム投稿タイプの件数をトップページで表示する方法

投稿2021/03/23 09:35

編集2021/03/23 09:37
FKM

総合スコア3624

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

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

ztj

2021/03/24 01:24

ご回答ありがとうございます。 やはりページャー部分が問題だったのですね。 今回はページャー部分の $wp_query を $custom_query に変更したら正常に生成されるようになりました。 ページャーについてもほぼコピペで作成していたので、 カスタマイズできるようリンク先の記事も参考にさせていただきます。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問