原因
ページ送りが動かない原因は大別すると下記の2つです
- pagedが効いていない
- posts_per_page(1ページ当たりの投稿の取得件数)が正常に動いていない。
ケースによってどちらかが原因となっていることが多く、非常に多くの人がこの現象に悩まされています。
コムデ社内においてもサイト構築の段階で同じようなトラブルはよく発生します。
基本的な対策
ー管理画面 > 表示設定 の「1ページに表示する最大投稿数」の数を1件にする
いくらテンプレート側でposts_per_pageで5件と指定していても管理画面側で10件とか書いてあると
大きい数字が優先されるようで「10件?そんなにないよ!」となって次ページが表示されないという不具合が起きてしまいます。
同サイト内でページャーを使う箇所がいくつもある場合はここの件数は1件にしておき、
表示数は常にposts_per_pageで指定するようにしましょう!
”paged=$paged”を指定する
これは簡単に言うと、「今表示しているページが何ページ目なのかわからないよ!」というwordpressに
「1ページ目だよ!」と教えてあげる記述です。
posts_per_pageを指定する。
これはwp_Queryやquery_postsを使用する際にテンプレート側で「1ページに表示する最大投稿数」を指定する記述です。
上記の基本の対策を踏まえた記述例
query_posts
<?php $paged = get_query_var('paged') ? get_query_var('paged') : 1 ; ?>
<?php query_posts("posts_per_page=10&paged=$paged");//表示するページ数を10pに指定 ?>
<?php if(have_post()) : while (have_posts()) : the_post(); ?>
<!-- ループ処理 -->
<?php endwhile; ?>
<?php endif; ?>
もしくは
<?php query_posts('foo=bar&paged='.get_query_var('paged')); ?>
<?php if(have_post()) : while (have_posts()) : the_post(); ?>
<!-- ループ処理 -->
<?php endwhile; ?>
<?php endif; ?>
wp_query
<?php $paged = get_query_var('paged') ? get_query_var('paged') : 1 ; ?>
<?php
$args = array(
'paged' => $paged,
'post_type' => post,
'category_name' => home,
'posts_per_page' => 10,
'post_status' => 'publish'
);
?>
<?php $myquery = new WP_Query( $args ); ?>
<?php if ( $myquery->have_posts() ) : while ( $myquery->have_posts() ) : $myquery->the_post(); ?>
?>
その他の対策
wp_queryを使用している場合
wp_pagenaviの記述に$queryを加える
上記のようにwp_query内の変数を$myqueryとしている場合であれば
wp_pagenaviの出力箇所にも下記のように指定
<?php if(function_exists('wp_pagenavi')){
wp_pagenavi(array('query'=>$myquery));
}?>
functions.phpに記述を追加
これはレアケースかと思いますが、カスタムタクソノミーで同じ名前のカテゴリタイプとタグを指定している場合などに
バッティングしており不具合を起こすケースもあるようです。
下記はfunctions.phpで特定のカテゴリのアーカイブページのみposts_per_pageを指定する記述
管理画面の投稿件数設定を特定のページのみ変更
<?php
function change_posts_per_page($query) {
if ( is_admin() || ! $query->is_main_query() )
return;</p>
<p> if ( $query->is_tax(hoge_cat)|| $query->is_tax(hoge_tag) { /* 特定のアーカイブページの時に表示件数を○件にセット */
$query->set( 'posts_per_page', '1' );
}
}
add_action( 'pre_get_posts', 'change_posts_per_page' );
?>
まとめ
大体のケースは上に挙げた基本的な対策で済んでしまうような場合が多いようですが、その他の対策もいざという時に使えるので
覚えておくと役に立ちます!こういった対策を利用して効率の良い構築をしたいものですね。