MENU

WordPress ページネーション講座

目次

1. ページネーションとは

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

ページネーション実装の種類

①超・超シンプルページネーション(ナビゲーション)

  • 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' => '次へ'
));

主な違いのポイント

  1. 総ページ数の参照先:
    • メインループ: $wp_query->max_num_pages
    • サブクエリ: $custom_query->max_num_pages (インスタンス名は任意)
  2. 現在のページ番号:
    • メインループ: get_query_var('paged')
    • サブクエリ: 事前に変数に保存した値 $paged
  3. クエリの設定:
    • メインループ: 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_textnext_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
));
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次