次のページが表示されない!WordPressでページ送りができないときの原因と対処方法
公開日:
:
Web技術・ノウハウ, Wordpress プラグイン, ページ送り
先日対応したお客様のWordPress案件で、category.phpに「同カテゴリーに属する情報を一覧表示」という機能を実装しました。これ自体はよくあるケースだと思いますが、パーマリンクの形式を「ドメイン名/%category%/%post_id%/」とし、URLに/category/を含まない形式でカテゴリーページを作ったところページ送り(ページネーション、ページナビゲーション)がうまく動かない事態に・・・。色々調べて解決しましたが、同じようなWordPressページ送り問題
でハマる方が少なくないようです。
そこで「URLにcategoryが無いとページ送り(ページネーション、ページナビゲーション)が動かない!どうやっても2ページ目以降が404 NotFoundになるんだけど?」と嘆いている人のために、原因と対処方法を書き残しておきます。
目次
前提
- 記事一覧の取得はWP_Queryを使用
- ページネーションはWP-PageNavi等のプラグインは使わずにpaginate_links関数で実装
- URLに「category」が入っているときは正常にページ送りができる
原因を調べる – 何が問題なのか?
ページ送り用の情報がおかしくなっているのか、それともデータ自体が取得できていないのか・・・何が問題かを特定するため、該当ページのデータを見える化します。
header.phpの<body>の直後あたりに
<?php print_r($wp_query); ?>
を入れて、現在のページに関する情報(WP_Queryオブジェクトの中身)がブラウザ上に表示されるようにしておきましょう。
次にブラウザのURL欄に「http://ドメイン名/page/1/」と手入力して表示してみます。
これは「現在1ページ目ですよ」という意味になるので、本来なら現在のページ番号を表す[paged]に「1」が設定されるはずです。ところがページ送りがうまくいっていない場合、[paged]の値が0になって404(NotFound)ページが表示される、またはトップページに飛ばされてしまいます。
WordPressの仕組みからいえばpagedにはURLのクエリ文字列(パラメータ)の値が入るはず。ということで、URLに「?paged=ページ番号」と指定してみてはどうでしょうか?
ブラウザのURL欄に「http://ドメイン名/?paged=1」と手入力して、改めて[paged]の値を見てみましょう。今度は[paged]に「1」が設定され、1ページ目の情報が表示されるようになったのではないでしょうか。「http://ドメイン名/?paged=2」の場合はどうでしょうか?2ページ目もちゃんと表示されるなら、特定のページに該当するデータを取得するページング処理自体は正常に動作しているということです。
ということは、どうも「URLのページ指定→WP_Queryオブジェクトのページ番号pagedをセット」の部分に問題がありそうです。
解決策 – URLの形式を変える or 「FV Top Level Categories」プラグインを使う
上記の原因から考えると、
「URLのページ番号がWP_Queryオブジェクトのpagedにきちんと渡されるようになれば、ページ送りも正しく動く」
という仮説が成り立ちます。
#「仮説」と書くとカッコイイですが、要は「理屈で言えばそうなるはずだよね?」ということです^^;
さっそくこの仮説を確かめたいところですが、ではどうやってページ番号渡しをすれば良いのでしょうか?
方法としては以下2つが考えられます。
- 【方法1】URLの形式を「http://ドメイン名/?paged=ページ番号」に変える
- 【方法2】URLが「http://ドメイン名/page/ページ番号/」でもWP_Queryオブジェクトのpagedに値が入るようにする
URL側を何とかするか、URLのクエリ文字列(パラメータ)を受け取る側で何とかするか、というお話ですね。
以下でそれぞれの方法を解説していきます。
【方法1】URLの形式を「http://ドメイン名/?paged=ページ番号」に変える
ページ送りとは、以下のように次のページ(他のページ)へのリンクを用意することです。
—————–
1 2 次へ »
—————–
方法1は、この「2」や「次へ」のリンク先、つまりaタグのhrefに設定されるURLを「http://ドメイン名/?paged=ページ番号」形式にしてしまおうというアプローチです。
今回ページ送りの実装に使っている関数paginate_linksには、「format」というパラメータがあります。このformatに’?paged=%#%’と指定することで、ページ送りのリンク先のURL形式を「http://ドメイン名/?paged=ページ番号」に変えることができます。
formatパラメータの設定例
CODEXにpaginate_linksを使う例があったので引用します。これを見るとformatパラメータの使い方もわかると思います。
<?php
$big = 999999999; // need an unlikely integer
echo paginate_links( array(
'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
'format' => '?paged=%#%',
'current' => max( 1, get_query_var('paged') ),
'total' => $the_query->max_num_pages
) );
?>
【方法2】URLが「http://ドメイン名/page/ページ番号/」でもWP_Queryオブジェクトのpagedに値が入るようにする
方法1がうまくいかなかったり、何らかの事情でURLの形式を変えたくない場合もあるでしょう。
方法2は、URLはそのままでページ番号の受取・設定処理の方を変えてしまおうというアプローチです。実現方法は色々ありそうですが、今回は「FV Top Level Categories」というプラグインを使います。
FV Top Level Categories はURLから「category」を除去するときに使えるプラグインですが、同時にURLに「category」が無いときに起こる問題
にもキチンと配慮がなされています。そのためページ送りがあっても不具合が起きません。
使い方はカンタンで、通常のプラグイン同様にインストール・有効化するだけでOKです。設定項目もありますが、特定のページでだけ有効にするといった必要が無ければ設定不要です。
その他ページ送り関連のチェックポイント
やや本筋から逸れますが、WordPressのページ送りに関連したありがちな問題
にも触れておきます。
【ケース1】1ページあたりの表示件数がおかしい
WordPressの管理画面には、1ページあたりの表示件数を指定する項目があります。
WP管理画面の設定 > 表示設定 の表示件数
ページ送りの表示件数が意図したとおりにならないときは、この設定に表示件数を確認してみましょう。
【ケース2】設定は合っているはずなのに反映されない
WordPressの管理画面から「パーマリンク設定」を更新してみましょう。
【ケース3】特定のカテゴリーページが表示されない/意図したとおりにならない
同じスラッグ名の固定ページがありませんか?
名前が重複すると優先度の高い方だけ処理されたり、思ったとおりにデータが取れなくなったり、とトラブルの元になります。
あえてそうしているのでなければ、別々の名前にしておきましょう。
【ケース4】2ページ目以降のデータが正常に取得できない
一覧データをquery_posts関数で取得していませんか?
query_postsはメインループ用の関数であり、●●カテゴリーのデータ
のような特定の条件に合致するデータを取得するためのものではありません。
また、「query_postsに条件を指定してデータを取得すること」=「メインループの条件を変えること」ですので、サイドバーのデータなどquery_postsで取得されたデータを使っている箇所がおかしくなる可能性があります。
同一カテゴリーに該当するデータを取得して一覧表示したいなら、メインループに影響を与えないようにするためWP_Queryでサブループを作ってデータを取得するか、pre_get_postsで該当ページのみメインループの条件を変えるようにしましょう。
【参考】query_postsとget_query_postsの違いについて参考になる記事(外部サイト)
WordPressでページ送りが動かないのはどう考えてもquery_postsが悪い!【pre_get_posts、WordPressループまとめ】 | notnil creation weblog
おわりに
WordPressのページ送り(ページネーション、ページナビゲーション)問題について原因と対処方法をつらつらと書いてきましたが、いかがでしたでしょうか?
私も初めてこの問題に遭遇したとき非常に困って、「WordPress ページ送り できない」「WordPress ページネーション 404」「WordPress ページング 表示されない」「WordPress ページナビゲーション 動かない」・・・などなど、あらゆるキーワードで検索して解決策を探し続けた思い出があります。このような部分でつまづくのは時間がもったいないですし、精神衛生上よろしくありません。
ですので、この記事がWordPressのページ送りがうまくいかずに苦しんでいる方の助けになれば良いなあと思っています。
以上、「次のページが表示されない!WordPressでページ送りができないときの原因と対処方法」でした。
PR
関連記事
-
-
URLを指定するだけでWebサイトを丸ごとダウンロードできるMacアプリ『SiteSucker』
Web制作をしていると、特定のサイトをローカルにダウンロードしたいと思うことがありませんか?
-
-
Rubyで小数点第2位以下を切り捨てる方法
Rubyには標準で便利なメソッドがたくさん用意されています。数値の取り扱いについてもNumericク
-
-
【保存版】全訳:Webサイトユーザビリティーチェックリスト25項目
本質的な知識というものは時が経っても価値が失われません。 User Effect の 「25-
-
-
『Active Preview』で編集内容をリアルタイムプレビュー
最近使ってみたWordPressプラグイン『Active Preview』が便利だったのでご紹介しま
-
-
自作テーブルの追加からデータ取得まで!WordPressでデータをDBに保持して使う方法
WordPressでWebサイトを作ったとき、何かしらのデータをデータベース上に保持しておき必要
-
-
【SEO初心者向け】検索順位を確実に上げるためのWordPress×SEO基礎知識
「うちのホームページをネット検索に強くしたい。でもやり方がわからない。」 WordPressで
-
-
ムダな履歴データの蓄積をストップ!『Revision Control』で投稿ページ・固定ページの変更履歴をスマートに管理
投稿ページ・固定ページの「変更履歴」を制御するプラグイン『Revision Control』をご
-
-
【Git】一つ前のcommitに戻す/他のブランチのcommitを取り込む
久しぶりにRailsでプログラムを書いている関係で、これまた久しぶりにgitを使っています。 で、
-
-
WordCamp2014 Tokyo に行ってきました。
もう一週間ほど経ってしまいましたが、先週末に初めてのWordCamp(WordCamp Toky
-
-
『Simple Custom CSS』はテーマをいじらずちょっとCSSを編集したいときに便利なプラグイン
CSSだけ編集したいけれどWordPressのテーマを直接編集するのは避けたい、かといって子テーマを
Comment
[…] 次のページが表示されない!WordPressでページ送りができないときの原因と対処方法 […]
[…] 次のページが表示されない!WordPressでページ送りができないときの原因と対処方法 ■・・・【】 […]