カスタム投稿でページネーションを使用する方法
WEB
カスタム投稿をタクソノミーを限定して一覧表示をさせた場合、ページネーションがどうしてもうまく動かなかった。
色々調べた結果、$pagedでページの数をうまく取得できず、ページネーションへサブループをうまく渡せていなかったのが原因でした。
今まではカスタム投稿全体をアーカイブで表示することばかりで、今回の様にタクソノミーごとのアーカイブを用意することはなかったので、詰まってしまいました。
通常投稿で、カテゴリーごとに取得する場合はquery_postを使って、カテゴリーや表示件数を指定するんだけど、カスタム投稿ではそれがうまく行かないとのことで、pre_get_queryを使う方法を参考にして行いました。
はじめにfunctions.phpで関数を定義します。
//カスタム投稿でページネーションを使う問題を解決するにはpre_get_posts関数を使う
function change_posts_per_page($query) {
if ( is_admin() || ! $query->is_main_query() ) {
return;
}
if ( $query->is_tax( 'area' ) ) {//ここでタクソノミー名を設定
$query->set( 'posts_per_page', '5' );//ここで表示件数を設定
}
}
add_action( 'pre_get_posts', 'change_posts_per_page' );
ここでは関数内でタクソノミーの指定と表示件数を指定しています。
次に通常のloop文を使用します。
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?> -- ここにloopさせる内容を記述 -- <?php endwhile; endif; wp_reset_postdata();?>
ここでは通常のloop文を使用しています。
*自分ではtaxonomy-●●.phpで特定のタクソノミーに使われるテンプレートを用意しました。
最後にページネーションを表示します
<!-- ナビゲーション -->
<div class="activity-nav col-120">
<?php 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' => 5,
'current' => ($paged ? $paged : 1),
));
?>
</div>
<!-- //ナビゲーション -->
ここページナビゲーションは、2番目のloop文の外、つまり関係のないところですね。
そこに記述します。
これでカスタム投稿のタクソノミー別アーカイブであっても正常にページネーションが稼働します。
感想
ページナビゲーションのプラグインを使用したんですが、動かなかった(設定方法がわからなかっただけかも)ので今回自作の方法をいろんなサイトを参考にさせてもらいながら実装に至りました。
本来であれば参考にしたサイトのURLを記載するべきなんでしょうが、短時間でいろんなサイトのいろんな記事を参照したので、よくわからなくなりました。
申し訳ありません。
この場でお礼と共にお詫びいたします。