この実装、面倒なら代行します
投稿一覧にページネーションは付きものです。
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を使って実装するのが良いと思います。
あくまでも、王道でない、亜流の、しかし手っ取り早く、ページ遷移しないページネーションを実装する方法でした。
WordPressカスタマイズ事例やウェブ制作ノウハウの新着情報、お役立ち情報を
リアルタイムにメルマガ配信!
100ウェブで手がけた制作・開発案件を一部、ご紹介。
クライアントからご相談いただいた内容とその実装におけるポイント、工期、予算について確認いただけます。
【テレワーク実施中 につきお電話転送中】
コール中1秒程度無音状態になりますがそのままお待ちください。
受付時間
平日 10:00~18:00
メールでのお問い合わせでも
1営業日以内にご連絡いたします。