ブログ

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

Archive

Category

Recent Entry


042-783-3557
平日9:00〜19:00

フォームからの
お問い合わせ

LINEでの
お問い合わせ
電話
LINE友達登録
ページTOPヘ