BLOGWEB作成からカメラ・ガジェット・PC系など雑多なブログWEBWordPressjQuerySublimeTextCSSCAMERAPCGADGETABOUTWEBページネーション(ページャー)が動かない!!wordPres...WEBページネーション(ページャー)が動かない!!wordPressの意外な落とし穴2016年02月09日2018年11月30日phpwordpressTweetPocketあれ!?Wordpressでページ送りが動かない!な時も慌てず確認ブログにページネーション(ページャー)を導入しようとしたとき相当慌ててしまいました。半狂乱になって丸一日調べても全く解決策が出てこない・・・ドウシテコウナッタ思考停止してしまった頭でぼんやりダッシュボードを眺めてて、ふと思いついた設定の変更ひとつで・・・・こともあろうにあっさり機能しました。こんな体験談をもとにページャーが動かない問題の切り分けをしていきたいと思います。1.ダッシュボードの表示設定を確認する初歩的な箇所ですが一応確認しておきましょう。件数より投稿数が少なければ当然ページネーションは表示されないし、もちろん2ページ目以降のページも生成されません。ページネーションの作動テストをする際は1件表示にしてみましょう。2.パラメータでoffsetを使っていないか上層のページを飛ばして表示させるパラメータ「offset」を指定するとページネーションは動かない仕様のようです。これは諦めるしかなさそうです。3.ページネーションで自動生成されるurlでの表示を確認するページネーション以前に果たして表示するべきページは存在するのでしょうか?なければ表示されないのも当然。そこから確認していきましょう。ページ送りをするということは間違いなく2ページ目はあるという前提なので、試しに下記のURLをブラウザに直接入力してみましょう。・アーカイブページなら「「http://ドメイン名/カテゴリスラッグまたはタグスラッグ/page/2/」/page/2...はページ送りが発生した際自動的に生成されるページです。表示されなければページ送りに必要な次ページの生成に問題があると考えられます。すればこの症状が発生するかをいくつか検証してみたのですが、下記の状態で発生することが確認できました。原因はダッシュボードで設定した表示数から算出されたページ数を前提に1ページしか生成されなかったものに、サブループでページ送りを別に用意しても2ページ目以降は存在しない、という結果になったのでしょう。他にも色々なケースでこの事象が発生するのでしょうが、ページ送りがうまくいっていないのが原因であることは確かなようです。投稿タイプのテンプレートではメインループ優先になり、サブループのページネーションは機能しないということでしょうちなみにこちらのサイトを参考にさせていただきました。次のページが表示されない!WordPressでページ送りができないときの原因と対処方法4.固定ページのサブループでページ送りに必要なコードは書かれているか通常投稿ページでのメインループでのページネーションではさほどトラブルは発生しないと思います。プラグインにしてもソースを公表してくれている方もほぼ投稿ページ前提で作っているはずだからです。トラブルが発生するケースは固定ページ上ないしサブループで起こるものと推測されます。固定ページサブループでうまく表示されないトラブル・2ページ目以降が1ページ目と同じ表示になる。Found)かトップページに飛ばされるといったものはpagedをうまく取得できていないケースが多いようです。pagedとはページ送りが発生した際、現在何ページにいるかの値が格納されている$wp_queryのパラメータではページネーション対策されたサブループのコードを見ていきます。wp_queryでのサブループ基本型(ページネーション使用前提)[crayon-5e59e5fd1f2fb563293750/]上記は基本的な構文ですが、ページネーションを使用する上で大事なのは2行目と6行目になります。2行目[crayon-5e59e5fd1f30c617571673/]これは$wp_query内にある、現在何ページ目かを示す値「paged」をget_query_var()関数で拾って$pagedに代入しています。ちなみにれを詳細に書くとこうなります。[crayon-5e59e5fd1f310825106789/]pagedの初期値は0になるのに2ページ目はpage/2というurlがつけられて、ページネーションに都合が悪くなるので「pagedの値が0の場合は1を代入する」という式になっています。6行目[crayon-5e59e5fd1f313264060055/]先ほど取得(代入)した$pagedをループ処理用クエリのパラメータにあてます。これでサブループの中に現在何ページ目かを認識させることができる、という訳です。この件はこちらのフォーラムに詳しく書かれています。WPフォーラム:WP_Queryでのページネーションについて5.$pagedやmax_num_pagesの値は取れているか前項で$pagedが何ページ目かを示す値という話をしましたが、ページネーションを作動させるにはもう一つの値が必要になります。総ページ数を示すmax_num_pagesです。mux_num_pagesとはページ送りが発生した際、投稿数と1ページの表示数から算出された総ページ数の値が格納されている$wp_queryのパラメータページネーションのトラブル・ページネーションが表示されない。・表示されてもページ数が違うこういったケースはmax_num_pagesのトラブルが考えられます。この値は$wp_query内に格納されているので見てみましょう。(ダッシュボードの表示設定とサブループの表示設定とで値を変えて試してください。)サブループで出力される2つのmax_num_pagesの値を見てみる[crayon-5e59e5fd1f317350082499/]1行目は普通に$wp_queryから取得したもの。11行目はサブループ内で取得したもの。それぞれ違う値が出力されるはずです。max_num_pages・・・サブループで設定した値これでひとつ謎が解けました。3項で挙げた表示ページ数の齟齬やサブループでページネーションが表示されないのはこれで説明がつきます。ページネーションに適正なmax_num_pagesを渡してやれば機能するはずです。固定ページのサブループで使用するにあたって2点ほど解決策を挙げておきますので参考にしてみてください。[crayon-5e59e5fd1f31c880420723/]ページネーションの関数にwp_queryの代わりにサブループで定義した$my_queryを当ててますね。[crayon-5e59e5fd1f321359590460/]サブループで生成した$my_queryからmax_num_pagesを取得して、その値自体をページネーションに渡しています。2,など)の差によって記事のないページが生成され、そのページにもリンクは張られてしまいます。3記事の投稿があって、wordpress側で1ページ1記事表示、サブループ側で1ページ2記事表示の設定をした場合、ページ送りのページはwordpress側の設定によって生成されるので3ページ(/page/3/)、でも実際は2ページになり、空白の3ページ目ができてしまいます。リンクは張られなければ問題はないのですが、例で挙げた寝ログ様のページャーですと空白の3ページ目にもリンクが作られてしまうので、抑制するのにfunctions.phpを下記のように加工しておいたほうが良いでしょう。(自分で組んだコードではないので全文掲載は控えさせていただきます。)[crayon-5e59e5fd1f327458450682/]1つ戻る、の部分はそのままで影響はありませんが、気になるようでしたら同様に加工しておいても良いかもしれません。6.「フロントページの表示」で固定ページを選択していないか実はここまで調べてもまったく改善せず頭を抱えたのですが、最後に思わぬ落とし穴がありました・・・ブログ構築にあたってトップページをindex.phpではなくfront-page.phpにしていたのですが、まんまと固定ページを選択していました・・・これまで投稿ページと固定ページの違いなんてカテゴリやタグが使えるか使えない程度くらいでしか考えてなく、形式的に使い分けていましたが、$wp_queryが出力するデータいかんで用途や用法がガラリと変わるんですねぇ。まとめ:理屈が分かれば怖くない!ページネーションの問題を自分なりに切り分けて解説してみました。いくらか実証を繰り返してみたので、解釈に多少の差異はあるかもしれませんがこの記事で挙げた条件と対応ではしっかり動くはずです。ソースによってはfuncitons.phpを改変する必要があるかも知れませんが、基本的にpagedとmax_num_pagesの値の問題だと思います。ちなみにカスタム投稿タイプでも同様の対応で問題ありませんでした。TweetPocketこのカテゴリで良く読まれている記事ページネーション(ページャー)が動かない!!wordPressの意外な落とし穴jqueryでフェードイン表示!.animateでコンテンツや画像をフワッと表示させる方法Lightbox2のモーダルウィンドウを任意のサイズにカスタムするCSSでフキダシやリボンを作る方法!疑似要素で利用するborderの基礎を理解する。PMとおりすがりありがとうございます。参考にさせて頂きました。あと、post-typeではなくて、post_typeかもしれません。PMちくちくコメントありがとうございます。参考にになったようで何よりです!あと、ご指摘ありがとうござます。post_typeでしたね...早速修正しておきました。Cancel)次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。コメントデータの処理方法の詳細はこちらをご覧ください。