こんにちは。rioです。

最近仕事で、wordpressのテンプレート作ることが増えてきました。

wordpressのページャーと言えば、呪文のように、「paginate_links」を使っているようなイメージですが・・・・確認してみると、ページネーションは表示されているものの、URLパラメータが付かず、コンテンツの内容が変わらない事態に・・・

<?php echo paginate_links( array(
					'prev_text' => 'Prev',
					'next_text' => 'Next',
					'mid_size'  => 1,
				) ); ?>

試した事その1:WP_Queryを使ったページネーション実装

仕方がないので、WP_Queryを使ったページネーション実装を試しました。

冒頭部分で取得する記事のタイプや公開されているかどうかなどのステータス情報、そのほか、1ページあたり表示したい記事数などのサブループを指定するのですが、これも、ページャーとして表示はされるが動かないツ・・・・

<?php
  $paged = get_query_var('paged') ? get_query_var('paged') : 1;
  $args = array(
    'post_type' => array('post'),
    'post_status' => array('publish'),
    'order'=>'desc',
    'orderby'=>'post_date',
    'paged' => $paged,
    'posts_per_page' => 10
  );
//以下略

試した事その2: $pagedの指定方法が、固定ページテンプレートと一覧ページテンプレートで異なる

色々ググっていたら発見。なるほど。

//category.phpやarchive.phpなどの一覧テンプレート
$paged = get_query_var('paged') ? get_query_var('paged') : 1;

//page.phpなどの固定ページテンプレート
$paged = get_query_var('paged') ? get_query_var('page') : 1;

私が実装しようとしていたのはindex.php。あれ?やってみたけどどっちも動かなくない・・・・?

この後の解決策が見つからず、ここで数時間ハマりました。どういう条件下で起きるのかまではわからなかったんですが、index.phpでこうした WP_Queryを使ったページネーション が動かないことはよくある模様。そもそもindex.phpは、TOPページとしてあまり使うべきではないそうなんですが、事情で変更するわけにもいかず。

しばらく色々試した結果、下記で問題なく動きました。

$paged = ( empty( $paged ) ) ? 1 : $paged;

少しだけ解説すると、「 get_query_var(‘paged’) 」では、現在のページ数を取得し、現在地を1ページ目にする、というような意味だが、

上に書いた「empty( $paged )」は、変数$pagedに対して、 値があればTRUE、なければFALSEと返す。三項演算子を用いて、$pagedのデフォルト値を1としているので結果は TRUE でデフォルト時の1となる。

現在のページ数を取得しているわけじゃないのでURLパラメータ付いたらおかしくなるんじゃ?とも思いましたが特に不都合なく動いてました。

むしろURLパラメータでいま自分がどこのページに居るのかが決まっているので、わざわざ現在のページ数を取得する必要なかったのか・・・・なるほど・・・となった次第でした。