1. ページネーションとは
- コンテンツを複数ページに分割して表示する仕組み
- 「記事一覧のページネーション」と、「1記事内で記事を分割するページネーション」がある

ページネーション実装の種類
①超・超シンプルページネーション(ナビゲーション)
next_posts_link()
とprevious_posts_link()
: 前後のページへのリンクのみ
<?php previous_posts_link( '« 新しい投稿' ); ?>
<span>|</span>
<?php next_posts_link( '古い投稿 »' ); ?>
②もっともシンプルな実装
the_posts_pagination()
を使った実装
- メインクエリでしか使えない
- HTMLコードまでまるっと自動生成してくれる(つまり実装が簡単)
- 細かいカスタマイズができない
- WordPress4.1以降から使える
サンプルコード
超シンプルな実装
the_posts_pagination();
オプション付き実装
the_posts_pagination( array(
'mid_size' => 2, // 現在のページの前後に表示するページ数
'prev_text' => 'まえぇ!', // 前のページへのリンクテキスト
'next_text' => 'つぎぃ!, // 次のページへのリンクテキスト
'screen_reader_text' => 'ページナビゲーション' // スクリーンリーダー用テキスト
) );
mid_size => 2
:
- 現在のページ番号の前後に表示するページ番号の数を指定します
- 例えば現在が5ページ目の場合、
mid_size => 2
だと 3, 4, 5, 6, 7 のページ番号が表示されます - デフォルト値も 2 なので、このパラメータは省略可能です
prev_text => '前へ'
:
- 「前のページ」へのリンクに表示するテキストを指定します
- デフォルトは ‘Previous’ (翻訳されたもの) なので、日本語サイトでは変更すると良いでしょう
next_text => '次へ'
:
- 「次のページ」へのリンクに表示するテキストを指定します
- デフォルトは ‘Next’ (翻訳されたもの) なので、日本語サイトでは変更すると良いでしょう
screen_reader_text => 'ページナビゲーション'
:
- スクリーンリーダー用のテキストを指定します
- 視覚的には表示されませんが、スクリーンリーダーを使用している視覚障害者のユーザーにページネーションの目的を説明します
- アクセシビリティ向上のために重要なパラメータです
③こまかなカスタマイズができる実装
paginate_links()
を使った実装- メインクエリでもサブクエリでも使えるページネーション
- こまかなカスタマイズが可能
サンプルコードと解説
メインループでの paginate_links()
の書き方
// メインループのページネーション
echo paginate_links(array(
echo paginate_links(array(
'base' => str_replace(999999999, '%#%', esc_url(get_pagenum_link(999999999))),
'format' => '?paged=%#%',
'current' => max(1, get_query_var('paged')), // メインループではget_query_var()を使用
'total' => $wp_query->max_num_pages, // グローバル変数$wp_queryを参照
'prev_text' => '前へ',
'next_text' => '次へ',
'mid_size' => 2,
'type' => 'list'
));
サブクエリ(カスタムクエリ)での paginate_links()
の書き方
// ページ番号を取得して変数に保存
$paged = get_query_var('paged') ? get_query_var('paged') : 1;
// カスタムクエリの実行
$custom_query = new WP_Query(array(
'post_type' => 'product',
'posts_per_page' => 10,
'paged' => $paged // ここでページ番号を指定
));
// カスタムクエリのループと表示処理
// ...
// カスタムクエリのページネーション
echo paginate_links(array(
'base' => str_replace(999999999, '%#%', esc_url(get_pagenum_link(999999999))),
'format' => '?paged=%#%',
'current' => max(1, $paged), // 保存した変数を使用
'total' => $custom_query->max_num_pages, // カスタムクエリのインスタンスを参照
'prev_text' => '前へ',
'next_text' => '次へ'
));
主な違いのポイント
- 総ページ数の参照先:
- メインループ:
$wp_query->max_num_pages
- サブクエリ:
$custom_query->max_num_pages
(インスタンス名は任意)
- メインループ:
- 現在のページ番号:
- メインループ:
get_query_var('paged')
- サブクエリ: 事前に変数に保存した値
$paged
- メインループ:
- クエリの設定:
- メインループ: WordPress が自動的に設定
- サブクエリ: クエリ作成時に
'paged' => $paged
のように明示的に指定
各パラメータの解説
テーマのCSSと連携しやすい
base
'base' => str_replace(999999999, '%#%', esc_url(get_pagenum_link(999999999))),
format
'format' => '?paged=%#%',
ページ番号のURLフォーマットを指定
?paged=%#%
は通常のWordPressのクエリ文字列形式
%#%
は実際のページ番号に置き換えられる
current
'current' => max(1, $paged),
現在のページ番号を指定
max(1, $paged)
で負の値や0を防ぐ
最小値を1にすることで、最初のページを保証
total
'total' => $custom_query->max_num_pages,
総ページ数を指定
カスタムクエリの max_num_pages
プロパティから取得
ページネーションの総ページ数を決定
prev_text
と next_text
'prev_text' => '前へ', 'next_text' => '次へ',
前のページ、次のページのリンクテキストをカスタマイズ
日本語やアイコン、矢印などに変更可能
mid_size
'mid_size' => 2,
現在のページの前後に表示するページ番号の数
この例では現在のページの前後に2つのページ番号を表示
type
'type' => 'list'
出力形式を指定
'list'
を使用すると <ul>
と <li>
タグでページネーションを生成
④1記事内を分割するページナビゲーション
wp_link_pages()
: 単一投稿内の複数ページのナビゲーション
<?php wp_link_pages(); ?>
- 特徴:
<!-- nextpage -->
タグで分割された投稿内での使用
設定→「ホームページの表示」を「固定ページ」にしたときのページネーション
// カスタムクエリのページネーション(サブクエリ)
echo paginate_links(array(
'base' => str_replace(999999999, '%#%', esc_url(get_pagenum_link(999999999))),
'format' => '?paged=%#%',
'current' => max(1, $paged),
'total' => $custom_query->max_num_pages,
'prev_text' => '前へ',
'next_text' => '次へ',
'mid_size' => 2,
'type' => 'list' // サンプルテーマのCSSに合わせて list タイプを使用
));
【参考情報】全パラメータ(引数)
the_posts_pagination()
全引数一覧表
引数 | データ型 | デフォルト値 | 説明 |
---|---|---|---|
base | 文字列 | 自動検出 | ページネーションリンクのベースURL。%_% がフォーマット文字列に置換される |
format | 文字列 | 自動検出 | ページ番号が挿入される部分。%#% がページ番号に置換される |
add_args | 配列 | array() | クエリ引数を追加するための配列 |
current | 整数 | 0 (自動検出) | 現在表示中のページ番号 |
aria_current | 文字列 | 'page' | 現在のページを示すためのARIA属性値 |
total | 整数 | 0 (自動検出) | 総ページ数 |
prev_text | 文字列 | 'Previous' | 「前のページ」リンクのテキスト |
next_text | 文字列 | 'Next' | 「次のページ」リンクのテキスト |
end_size | 整数 | 1 | 最初と最後に表示するページ番号の数 |
mid_size | 整数 | 2 | 現在のページの前後に表示するページ番号の数 |
type | 文字列 | 'plain' | ページネーションのHTML出力タイプ ('plain' , 'list' , 'array' ) |
before_page_number | 文字列 | '' | ページ番号の前に表示するテキストまたはHTML |
after_page_number | 文字列 | '' | ページ番号の後に表示するテキストまたはHTML |
screen_reader_text | 文字列 | 'Posts navigation' | スクリーンリーダー用のテキスト(視覚的には隠れる) |
class | 文字列 | 'pagination' | ナビゲーション要素に追加されるCSSクラス |
aria_label | 文字列 | 'Posts' | aria-label属性の値(アクセシビリティ向上のため) |
ちょっと高度なページネーション
- 無限スクロール
- Ajax を使用して下部でコンテンツを自動読み込み
- 実装: jQuery +
wp_ajax
アクションフック + スクロールイベント検知 - 特徴: シームレスなUX、SEOに課題あり
- 「もっと見る」ボタン
- クリック時に Ajax で追加コンテンツを読み込む
- 実装: jQuery +
wp_ajax
アクションフック + クリックイベント - 特徴: ユーザーの意思による読み込み、UXとSEOのバランス○
などといったものもあります!
====================== いったんここまでを目標
同一ページ内の複数ページネーション
- 異なるクエリパラメータを使用して実装
- それぞれのクエリとページネーションに独自のパラメータ名を指定
- 状態を独立して保持するための設計が重要
4. カスタマイズの方法と考え方
5. 重要な考慮点
アクセシビリティ
- スクリーンリーダー用テキスト
- キーボードナビゲーション対応
- 適切なARIA属性の使用
SEO対策
rel="prev"/"next"
リンク要素の追加- カノニカルURLの設定
- 検索エンジンがコンテンツを適切に理解できる構造
パフォーマンス
- 効率的なクエリ設計
- キャッシュの活用
- 大量データでの最適化テクニック
6. よくある実装パターンと解決策カスタムテンプレートでのページネーション
複数クエリのページネーション
// 独立したページネーションを持つ複数クエリの例
$first_page = isset($_GET['first_page']) ? intval($_GET['first_page']) : 1;
$first_query = new WP_Query(array(
'post_type' => 'post',
'posts_per_page' => 5,
'paged' => $first_page
));
$second_page = isset($_GET['second_page']) ? intval($_GET['second_page']) : 1;
$second_query = new WP_Query(array(
'post_type' => 'product',
'posts_per_page' => 6,
'paged' => $second_page
));
// 第一クエリのページネーション
echo paginate_links(array(
'base' => add_query_arg('first_page', '%#%'),
'format' => '',
'current' => $first_page,
'total' => $first_query->max_num_pages
));
// 第二クエリのページネーション
echo paginate_links(array(
'base' => add_query_arg('second_page', '%#%'),
'format' => '',
'current' => $second_page,
'total' => $second_query->max_num_pages
));