since 2003

blog ブログ

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を使わないバージョンということで…

関連記事

Archive

Category

Recent Entry