BLOG

ページネーションが簡単に出来るようになってた

| WordPress

WordPressのページネーション?ページャー?ってプラグインのするのが僕はずっと定番でした。
よく使ってるのがWP-PageNaviですね。ド定番です。
これめっちゃ簡単なので、これで決まりだということで、これに出会ってからその辺り何も調べなかったのですが、ふと出会ってしまったのでご紹介。

プラグインを使わないで「ページネーション」を実装

プラグインを使わないで、WordPressのコードを使うことのメリットは

  • WordPressのバージョン、プラグインのバージョンに依存せずに使える
  • プラグインを使うことで、動作が重くなるという可能性がでる

こういうのは、よく言われてることですが、結構大事ですよね。
よく言われるということは真実味があるということです。

ってことで、ここはプラグインを使わない方法をご紹介です。
チョー簡単です。

<?php
$the_query = new WP_Query();
if($the_query->have_posts()): while($the_query->have_posts()): $the_query->the_post();
// 中略
endwhile;
endif;

$big = 999999999; // need an unlikely integer
$args = array(
  'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
  'format' => '?paged=%#%',
  'current' => max( 1, get_query_var('paged') ),
  'total' => $the_query->max_num_pages
)
echo paginate_links($args);
wp_reset_postdata();
?>

はい、単純にはこんな感じです。
$argsでオプションを設定してカスタマイズできちゃいます。

オプション初期値説明
base%_%リンクを生成するために使われるベースのURL
format?paged=%#%ページネーションの形を指定
total1全体のページ数
current0現在のページ番号
show_allfalsetrueの場合、全部のページ番号を表示
end_size1ページ番号のリストの両端(最初と最後)にいくつの数字を表示するか。
mid_size2現在のページの両側にいくつの数字を表示するか(現在のページは含まない)
prev_nexttrueリストの中に「前へ」「次へ」のリンクを含むかどうか
prev_text__(‘ Previous’)前のページへのリンクとして表示する文言(’prev_next’ 引数が true 場合に有効)
next_text__(‘Next ‘)次ページへのリンクとして表示する文言。(’prev_next’ 引数が true 場合に有効)
type‘plain’戻り値の形式指定
“plain” 改行文字区切りのリンク文字列
“array” リンクの配列
“list” ul タグリスト
add_argsfalse追加のクエリ引数の配列
add_fragmentなしそれぞれのリンクに付け加える文字列
before_page_numberなしページ番号の直前に付け加える文字列
after_page_numberなしページ番号の直後に付け加える文字列

これがデフォルトの値なので、変更したい場合は、こちらで設定です。

<?php $args = array(
  'base'               => '%_%',
  'format'             => '?page=%#%',
  'total'              => 1,
  'current'            => 0,
  'show_all'           => False,
  'end_size'           => 1,
  'mid_size'           => 2,
  'prev_next'          => True,
  'prev_text'          => __('&laquo; Previous'),
  'next_text'          => __('Next &raquo;'),
  'type'               => 'plain',
  'add_args'           => False,
  'add_fragment'       => '',
  'before_page_number' => '',
  'after_page_number'  => ''
); ?>

こんな簡単なもんで、いけるんですね。
今後、こっち使っていこうかと思います。

参考

関数リファレンス/paginate links