1. WordPress

【WordPress】paginate_links() でページネーションを作成する方法!カスタマイズ方法も解説

Share

WordPressで記事一覧ページなどにページ送り(ページネーション)を実装したい場合、便利なのが paginate_links() 関数です。

この関数を使えば、シンプルで柔軟なページネーションが手軽に作成できます。この記事では、基本的な使い方からカスタマイズ方法まで丁寧に解説します。

paginate_links() とは?

paginate_links() は、ページナビゲーションのリンクを生成する WordPress の組み込み関数です。

例えば、アーカイブページやカスタムクエリで複数ページにまたがる投稿一覧を表示する際に使用します。

返り値は「HTML形式のリンク」または「配列(typeをarray指定時)」です。

引数なしの paginate_links() の出力結果とHTML構造

paginate_links() は、引数を省略して呼び出すことも可能です。ただし、この場合はグローバル変数 $wp_query をもとに、自動的に現在のクエリ状況をもとに出力を行います。

例:引数なしの使用例

echo paginate_links();

このように記述した場合、WordPress は現在の $wp_query を利用して、ページリンクを出力します。ただし、カスタムクエリを使っている場合には、正しく動作しない可能性があるため注意が必要です。

実際に出力されるHTML例

例えば、5ページ分の記事がある場合に2ページ目を表示しているとき、以下のようなHTMLが出力されます。

<span class="page-numbers prev">« 前へ</span>
<span class="page-numbers current">2</span>
<a class="page-numbers" href="/page/3/">3</a>
<a class="page-numbers" href="/page/4/">4</a>
<a class="page-numbers" href="/page/5/">5</a>
<a class="page-numbers next" href="/page/3/">次へ »</a>

HTML構造のポイント

  • <a class="page-numbers">: 通常のページリンク。
  • <span class="page-numbers current">: 現在のページはリンクではなく、span タグで表示される。
  • <span class="page-numbers prev"> / <a class="page-numbers next">: 「前へ」「次へ」のリンクも含まれる(ページ位置により表示・非表示が変わる)。
  • クラス名はテーマでスタイルを調整しやすいように付与されている。

注意点

  • paginate_links() を引数なしで使用する場合は、メインクエリ内でのみ正しい動作を期待できます。
  • カスタムクエリ(WP_Query)を使っている場合は、明示的に totalcurrent などを指定する必要があります。

基本的な使い方

以下は、アーカイブページなどでよく使われる基本的なコード例です。

global $wp_query;

$big = 999999999; // 不正な値で置き換えて後で修正

echo paginate_links([
    'base'      => str_replace($big, '%#%', esc_url(get_pagenum_link($big))),
    'format'    => '?paged=%#%',
    'current'   => max(1, get_query_var('paged')),
    'total'     => $wp_query->max_num_pages
]);

このコードを使用すると、現在のページや投稿数に応じたページリンクが自動的に生成されます。

カスタムクエリで使用する場合

WP_Query を使って独自の投稿ループを作っている場合でも、paginate_links() は活用できます。
このときは max_num_pages をカスタムクエリから取得しましょう。

$paged = get_query_var('paged') ? get_query_var('paged') : 1;

$args = [
    'post_type'      => 'post',
    'posts_per_page' => 5,
    'paged'          => $paged
];

$custom_query = new WP_Query($args);

if ($custom_query->have_posts()) :
    while ($custom_query->have_posts()) : $custom_query->the_post();
        the_title('<h2>', '</h2>');
    endwhile;

    echo paginate_links([
        'base'      => str_replace(999999999, '%#%', esc_url(get_pagenum_link(999999999))),
        'format'    => '?paged=%#%',
        'current'   => max(1, get_query_var('paged')),
        'total'     => $custom_query->max_num_pages
    ]);

    wp_reset_postdata();
endif;

カスタマイズオプション

paginate_links() は多くの引数でカスタマイズが可能です。よく使われるものを以下に紹介します。

パラメータ説明初期値
baseページ番号のベースURL''
formatページ番号のフォーマット文字列''
total全体のページ数1
current現在のページ番号0
aria_current現在ページに付ける aria-current 属性値'page'
show_all全ページリンクを常に表示するか(true/false)false
end_size最初と最後に表示するページ数1
mid_size現在ページの前後に表示するページ数2
prev_next「前へ」「次へ」のリンクを表示するかtrue
prev_text「前へ」のリンクテキスト&laquo;
next_text「次へ」のリンクテキスト&raquo;
type出力形式(plain/array/list'plain'
add_argsクエリ引数を追加する配列またはfalsetrue
add_fragmentすべてのリンクに追加されるURLフラグメント''
before_page_numberページ番号の前に追加される文字列''
after_page_numberページ番号の後に追加される文字列''

必要に応じてこれらを指定し、デザインや挙動に合わせたページネーションを作成できます。

例:リスト形式にする

echo paginate_links([
    'total'     => $custom_query->max_num_pages,
    'type'      => 'list',
    'prev_text' => '« 前へ',
    'next_text' => '次へ »'
]);

例:中央にページリンクを絞って表示

echo paginate_links([
    'total'     => $custom_query->max_num_pages,
    'mid_size'  => 1,
    'end_size'  => 1
]);

注意点

  • ページネーションを表示するには、クエリに paged パラメータが必要です。
  • get_query_var('paged') は 1ページ目では空になるので、max(1, get_query_var('paged')) で補正しましょう。
  • カスタム投稿やタクソノミーアーカイブでも同様の使い方が可能です。

まとめ

paginate_links() を使うことで、手軽にかつ柔軟にページネーションを実装することができます。
テーマやレイアウトに合わせて typeprev_textnext_text などを調整すれば、デザイン性の高いページ送りが作れます。

参考リンク