WordPress カテゴリーページでのページ送りでの罠
2015.11.10
カテゴリーページでダッシュボードの投稿表示数に従わず、特定のカテゴリー指定で投稿表示数を指定したい場合は通常、以前はquery_posts、今時ならWP_Queryで指定する。
指定した表示数を超える場合、ページ送りのテンプレートタグ(my_paginateやposts_nav_link)を入れておけば自動的にページ送りされると思いきや…
無指定の場合は何の問題もないのだが、Query系で指定していると次のページへのリンクは出るものの、クリックしてみると次のページも1ページ目と同じ内容が…
まともにページ送りされない。
仕方なくダッシュボードの設定で指定した投稿数にしてしまうこともあった。
良い方法はないものかと調べていたが、やっと解決策を見つけた。
テンプレートに書き込み方法ではなくfunctions.phpに記述する。
pre_get_posts フック
function my_paginate(){
global $wp_query, $paged;
$p_base = get_pagenum_link(1);
$p_format = 'page/%#%';
if($word = strpos($p_base, '?')){
$p_base = get_option( 'home' ).(substr(get_option( 'home' ), -1 ,1) === '/' ? '' : '/')
.'%_%'.substr($p_base, $word);
} else{
$p_base .= (substr($p_base, -1 ,1) === '/' ? '' : '/') .'%_%';
}
echo paginate_links(array(
'base' => $p_base,
'format' => $p_format,
'total' => $wp_query->max_num_pages,
'current' => ($paged ? $paged : 1),
'end_size' => 1,
'mid_size' => 2,
));
}
function change_posts_per_page($query) {
if( is_admin() || ! $query->is_main_query() ){
return;
}
/* 「member」「info」のカテゴリーページで表示件数を6件にする */
if ( $query->is_category( array('member','info') )) {
$query->set( 'posts_per_page', '6' );
return;
}
}
add_action( 'pre_get_posts', 'change_posts_per_page' );
こいつを指定することで、全ての問題が解決された。
今後はWP_Queryと併せてpre_get_postsも使っていこうと思う。
追記
以前、query_postsでの回避法を載せてあった…(汗)
今回はquery_postsを使わないバージョンということで…
補足(2020.6.24)
$p_base = get_option(home)
の部分のhome周りに半角シングルクォーテーションを入れないと、将来的にPHPが対応しなくなるとの警告が出たので以下に修正
$p_base = get_option( 'home' )
BLOG