読者です 読者をやめる 読者になる 読者になる

ファイヤードブログ

ディジタル・パブリッシングという観点から、Webサイト制作、電子書籍制作などを。※ブログリニューアル中

WordPressの非ブログサイトにつきまとうページング問題

WordPress WebDev

 まだ完全な結論は出ていないんだけれど、現時点でこれが最善と思える解決策をメモしておきたい。
 先に解決策からいうと、非ブログサイト*1における記事(post)のインデックスページは、固定ページを作ってそこから新たにループを作り、wp_pagenaviプラグインを使ってページネーションを実現するのが一番いい。
 純粋な汎用テーマとしては可能な限りプラグインを排除したいところが、こればっかりは仕方がない。wp_pagenaviを有効化した上で次のように書けば、固定ページ内でpostのインデックスページを作ることができる。以下のコードはスニペットとして使える。

<?php 				
	$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
	$recent_posts = new WP_Query(array(
		'post_type' => 'post',
	        'paged' => $paged
	));
	if ($recent_posts->have_posts()):
         while($recent_posts -> have_posts()): 
            $recent_posts ->the_post();
	    get_template_part( 'content', get_post_format() );
	 endwhile;
		if (function_exists('wp_pagenavi')) {
			wp_pagenavi( array( 'query' => $recent_posts ));
		} 
	wp_reset_postdata();
        endif;
?>	

 ここから先、やや理解が怪しいことを注意書きした上で続けます。
 archive.phpの書き方を見ればわかるのですが、どうして上はこんな面倒なことになっているかといと、アーカイブページはサブループを回すまでもなくメインループでインデックスを拾ってきてくれるので、次のような書き方でも問題無い。

<?php 
    if(have_posts()):
      while ( have_posts() ) : the_post();
		get_template_part( 'content-excerpt', get_post_format() );
      endwhile; 
  <?php hoge_paging_nav(); ?>
    endif;
?>

 同時に、_s( Underscores | A Starter Theme for WordPress ) にあらかじめ備わっているページングのための関数(hoge_paging_nav())も問題にならない。
 しかし、これを上のwp_pagenavi()に代わるものとして使うことはできない。ここが落とし穴としてある。
 同じサイトでページネーションが複数種類あるとややこしいので、この流れでwp_pagenaviプラグインで統一することになる。この場合、上のhoge_paging_nav()を、wp_pagenavi()で置き換えることは全く問題ない。
 こうして、非ブログサイトにおけるページネーションは、wp_pagenavi()*2に頼ることになる。「スターターテーマなどでページング関数を用意してくれてはいるけれど、サブループには対応していないので、どうせならサブループにも対応してくれるプラグインのページングで統一しましょう」ということ。
 なお、wp_pagenavi()の注意点としては、ページング数が増えるとスタイルが乱れることで、特にRWD(レスポンシブデザイン)においてはあってはらならない状況が生じてしまうことがある。

*1:何がブログサイトで何が非ブログサイトなのかという定義はしようとしたがうまくできなかった。一つ言えるのは、トップページがpostのインデックスの1ページ目になっているサイトはブログサイトといえる。非ブログサイトではトップページにいろいろなカスタム投稿タイプのクエリが混在しているなどして、トップページを1ページ目として扱うことが難しい。

*2:このプラグインの名前を挙げるのは筆者が使い慣れているからで、同じことができれば他の何かでも全く構わない