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
)を使っている場合は、明示的にtotal
やcurrent
などを指定する必要があります。
基本的な使い方
以下は、アーカイブページなどでよく使われる基本的なコード例です。
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 | 「前へ」のリンクテキスト | « |
next_text | 「次へ」のリンクテキスト | » |
type | 出力形式(plain /array /list ) | 'plain' |
add_args | クエリ引数を追加する配列またはfalse | true |
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()
を使うことで、手軽にかつ柔軟にページネーションを実装することができます。
テーマやレイアウトに合わせて type
や prev_text
、next_text
などを調整すれば、デザイン性の高いページ送りが作れます。