ページ遷移しない投稿一覧のページネーションを、jQueryで手軽に実装する

投稿一覧にページネーションは付きものです。
100ウェブ事例紹介でも、一覧ページにおける通常のメインループでのページネーションについては何度も書いています。
参考までに代表的なメインループでのページネーションの記述について、以下に書いておきます。
例として archive.php
<?php
if (have_posts()) {
while (have_posts()) {
the_post();
//ループ処理
}
}
global $wp_rewrite;
$paginate_base = get_pagenum_link(1);
if(strpos($paginate_base, '?') || ! $wp_rewrite->using_permalinks()){
$paginate_format = '';
$paginate_base = add_query_arg('paged','%#%');
} else {
$paginate_format = (substr($paginate_base,-1,1) == '/' ? '' : '/') .
user_trailingslashit('page/%#%/','paged');
$paginate_base .= '%_%';
}
echo paginate_links(array(
'base' => $paginate_base,
'format' => $paginate_format,
'total' => $wp_query->max_num_pages,
'mid_size' => 1,
'current' => ($paged ? $paged : 1),
'prev_text' => '<',
'next_text' => '>',
)); ?>
これが一般的な一覧ページでのページネーションの記述です。
この場合、2ページ目を表示するときにはページ遷移が発生します。
さて今回は、めったにないケースですが、投稿の詳細ページのサイドバーなどに最新投稿10件とかを表示し、そのサイドバーの投稿一覧内だけでページネーションもしたいケースについて考えます。
このケースでは、本文部分はそのままにしておきたいのでページ遷移はさせないようにしたいですよね。
ページ遷移させないようにするなら、まあAjaxを使って非同期で次の10件を取ってくるやり方が王道ではあります。
ただ、これは少し難易度が上がるので、今回は少し要領よくやってしまう方法についてご紹介します。
その方法とは、投稿全件取得してしまって、最初は最新の10件だけ表示しておき、ページネーションリンクが押されたら次の10件を表示するようにする方法です。
これを実装するにあたり使うのが、jQueryプラグイン「paginathing.js」。
これを使うと、投稿を全件取得しておいて、設定した件数で分割してページネーション表示させるなんてことができます。
まず、paginathing.min.js をダウンロードしましょう。
Githubに上がっているのでここから取りましょう。
paginathing.js
ダウンロードしたpaginathing.min.jsを好きなディレクトリに収め(ここではjsフォルダに収めることとします)、jQueryと一緒に参照します。
jQueryは3.3.1で実際に動くのを確認していますが、他のバージョンでも動くと思います(1系でも動くようです)。
header.phpなど
<script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="js/paginathing.min.js"></script>
<script>
$(function () {
$('.js-pagination').paginathing({ //親要素のclassを記述
perPage: 10, //10件ずつ
prevNext: true,
firstLast: false,
prevText: '<',
nextText: '>',
containerClass: 'side-pagination-container', //この辺のクラスは自由に設定
ulClass: 'pnavi', //この辺のクラスは自由に設定
activeClass: 'current', //この辺のクラスは自由に設定
})
});
</script>
これで準備OK。
表示させたい箇所に次のように記述します。
<?php
$posts = get_posts(array( //メインループではないのでget_postsにします
'posts_per_page' => -1 //全件取得してしまいます
));
$html = '<ul class="js-pagination">';
foreach ($posts as $post){
$html .= '<li>
<a href="'.get_the_permalink($post->ID).'">'.get_the_title($post->ID).'</a>
</li>';
}
$html .= '</ul>';
echo $html;
?>
最新の10件が表示され、ページネーションリンクをクリックすると次の10件が表示されるページネーションのできあがりです。
投稿を全件取得する処理なので、一覧に画像を表示させたい場合などは重くなる可能性があり、おススメできません。画像を表示させたい場合は、普通にAjaxを使って実装するのが良いと思います。
あくまでも、王道でない、亜流の、しかし手っ取り早く、ページ遷移しないページネーションを実装する方法でした。