*

次のページが表示されない!WordPressでページ送りができないときの原因と対処方法

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
) );
?>

出典:関数リファレンス/paginate links – WordPress Codex 日本語版

【方法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

関連記事

Webサイトユーザビリティチェックリストの一部

【保存版】全訳:Webサイトユーザビリティーチェックリスト25項目

本質的な知識というものは時が経っても価値が失われません。 User Effect の 「25-

記事を読む

brewでmacのOpenSSLをバージョンアップ

macでローカル環境のopensslをバージョンアップする手順 〜 brewで更新→rbenvでrubyを再インストール 〜

先日自社の運営サイトのSSL証明書の更新作業をしたのですが、ローカル環境として使っているmacで

記事を読む

Intuitive Custom Post Order

ドラッグ&ドロップだけ!『Intuitive Custom Post Order』は投稿一覧のページ並び順をスイスイ変更できるプラグイン

WordPressの投稿一覧の各投稿ページをカンタンに並べ替えできるプラグイン『Intuitiv

記事を読む

Duplicated Post

『Duplicate Post』で投稿ページ・固定ページをカンタン複製

WordPressの投稿ページや固定ページを複製できるプラグイン『Duplicate Post』

記事を読む

【Git】一つ前のcommitに戻す/他のブランチのcommitを取り込む

久しぶりにRailsでプログラムを書いている関係で、これまた久しぶりにgitを使っています。 で、

記事を読む

SEOが強いWordPressサイトの内部を知る

【SEO初心者向け】検索順位を確実に上げるためのWordPress×SEO基礎知識

「うちのホームページをネット検索に強くしたい。でもやり方がわからない。」 WordPressで

記事を読む

Revision Control

ムダな履歴データの蓄積をストップ!『Revision Control』で投稿ページ・固定ページの変更履歴をスマートに管理

投稿ページ・固定ページの「変更履歴」を制御するプラグイン『Revision Control』をご

記事を読む

Public Post Previewプラグイン

公開前のページを第三者にシェア!『Public Post Preview』は下書きページへの共有リンクを発行できるプラグイン

公開前のページを第三者に確認してもらうのに便利なプラグイン『Public Post Previe

記事を読む

BootstrapでWordPressサイトをレスポンシブデザイン化

【やって覚える】BootstrapでWordPressサイトをレスポンシブデザイン化する方法

  先日Googleから「4/21以降、サイトのスマホ対応有無を検索結果の順位に反映

記事を読む

HTMLもCSSもまとめて一式ダウンロードできるmacアプリ

URLを指定するだけでWebサイトを丸ごとダウンロードできるMacアプリ『SiteSucker』

Web制作をしていると、特定のサイトをローカルにダウンロードしたいと思うことがありませんか?

記事を読む

PR

Comment

  1. […] 次のページが表示されない!WordPressでページ送りができないときの原因と対処方法 […]

  2. […] 次のページが表示されない!WordPressでページ送りができないときの原因と対処方法 ■・・・【】 […]

コメントを残す

PR

【Git】一つ前のcommitに戻す/他のブランチのcommitを取り込む

久しぶりにRailsでプログラムを書いている関係で、これまた久しぶりに

WordPressの子テーマで画像が表示されないときはstylesheet_directoryを使っているか確認する
WordPressの子テーマで画像が表示されないときはstylesheet_directoryを使っているか確認する

先日とあるお客様のWordPressサイトで「画像が表示されない」

おすすめGoogle拡張リスト
【保存版】情報収集を快適に!Chromeに入れておきたいオススメ拡張(エクステンション)8個

私はChromeをメインブラウザとして使っていますが、その理由のひとつ

Rubyで小数点第2位以下を切り捨てる方法

Rubyには標準で便利なメソッドがたくさん用意されています。数値の取り

BootstrapでWordPressサイトをレスポンシブデザイン化
【やって覚える】BootstrapでWordPressサイトをレスポンシブデザイン化する方法

  先日Googleから「4/21以降、サイトのスマホ

→もっと見る

  • feedlyでフォロー RSS登録ボタン
  • 株式会社YUKARIでは、ホームページリニューアルをメインにWeb制作事業を行っています。既存サイトへのWordPress導入・レスポンシブデザイン化からSEO強化まで何でもご相談ください。 ホームページリニューアルをお考えの方からのお問い合わせをお待ちしております。
PAGE TOP ↑