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