WordPressのページネーションの基本

WordPressでは投稿記事の一覧ページ(アーカイブページ)があります。

アーカイブページでページネーションを使用します!

固定ページでは普通使わないです、1ページで完結する設計ですからね

PHP Template Files archive.php category.php tag.php author.php date.php home.php

アーカイブページのURLは下記です

/タクソノミーのスラッグ/タームのスラッグ/

上記をベースににページについて追記し、そのページのURLになります

1ページに表示する記事数はWordPressの管理画面で設定できます

「表示設定」 > 「1ページに表示する最大投稿数」で設定

functions.php や pre_get_posts フィルターでもカスタマイズ可能です!

ページネーション付きのURLパターン:

  • カテゴリーの場合:/category/news/page/2/
  • タグの場合:/tag/design/page/3/
  • 投稿タイプアーカイブ:/portfolio/page/4/
  • 検索結果:/?s=keyword&paged=2
  • ブログトップ(home.php):/page/2/

つまり「page/数字/」がアーカイブのパスに追加される構造です。

「1ページ目」のページネーションのURLの動作

たとえば、、正式URL → /category/news/

page/1/ は 省略される(または省略するのが普通)

/category/news/page/1/ にアクセスしても動くが、リダイレクトで省略形に戻されるのが一般的

2ページ目以降は
/category/news/page/2/
/category/news/page/3/ …

なぜ1を省略するか?
SEO的に「page/1/」と「カテゴリトップ」の2つのURLが同じ内容を指してしまう(重複コンテンツ)のを防ぐため。

Googleなどの検索エンジンに「正しいURLはこっちですよ」と示すため、WordPressは自動でリダイレクトします。

ページネーション関係の関数まとめ

関数名用途カスタマイズ性主に使う場面
posts_nav_link()「前へ」「次へ」のリンク表示✕ ほぼない古いテーマ、最低限のナビでOKなとき
next_posts_link()「次のページ」リンクを表示△ ラベル文字のみ投稿一覧などで使える
previous_posts_link()「前のページ」リンクを表示△ ラベル文字のみ上とセットで使う
paginate_links()数字付きページネーション(1 2 3 …)◎ HTMLも調整可能オリジナルテーマやデザイン対応が必要なとき
the_posts_pagination()paginate_links()のラッパー関数(WordPress 4.1以降)◯ クラス名やテキストを調整できるシンプル&モダンなテーマで使う
the_posts_navigation()previous_posts_link() / next_posts_link()のラッパー△ 最低限のスタイルでOKならTwenty系テーマとかでよく使われる
関数名役割よく使う場面
get_query_var('paged')現在のページ番号を取得(クエリ変数から)WP_Query やページネーションの現在位置取得時
get_pagenum_link()任意ページ番号のリンクURLを生成paginate_links()base 設定に使う
user_trailingslashit()パーマリンクの末尾にスラッシュを付ける(WordPress流)パーマリンク形式の整合性を保つために使う
set_query_var()テンプレートパーツに変数を渡す(例えばクエリオブジェクト)get_template_part() とセットで使う
get_query_var()set_query_var() で渡された変数を取得するpaging.php 内で $paging_query を取得

ページネーションの機能をテンプレートファイルにまとめる場合は「set_query_var()」

ページネーションを別ファイルのテンプレートに記述して呼び出し「get_template_part()」で実装する場合は注意が必要です、、

WordPressのメインクエリはグローバル変数 $wp_query に格納されていますが、テンプレートを分割して get_template_part() で呼び出すと、そのスコープには $wp_query が見えない場合があります。

WordPressのスコープ問題 archive.php $wp_query (メインクエリ) 記事リスト表示エリア pagination.php(ページネーション部品) 問題: ページネーション部品内では $wp_queryにアクセスできない
global $wp_query;

// ページネーションのテンプレートファイルでクエリが見えないため明示的渡す
set_query_var('paging_query', $wp_query);

get_template_part('ページネーションのテンプレートファイル');