かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

WordPress 固定ページでもWP-PageNaviプラグインをつかいたい。

固定ページにサブクエリを使って投稿を表示させ、WP-PageNaviプラグインでページ送りを表示させる方法のめも。
固定ページのテンプレートにただプラグインを表示させるコードif(function_exists('wp_pagenavi')){wp_pagenavi();}を書いてもナビゲーションは表示されません。

引数に投稿のクエリを渡してあげる

WP-PageNaviを表示する関数にページ送りを表示させたいクエリを渡してあげればOKなようです。

<?php // page.php ページテンプレート

// サブクエリを作成
$the_query = new WP_Query(array(
  'post_type' => 'post',
  'posts_per_page' => 10,
  'post_status' => 'publish',
));
if ( $the_query->have_posts() ) :
?>
  <?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
    // サブクエリで取得した投稿を表示させる場所
  <?php endwhile; ?>
  // WP-PageNavi
  <?php
    if( function_exists('wp_pagenavi') ) {
      // サブクエリを引数で渡してあげる
      wp_pagenavi( $the_query );
    }
  ?>
<?php endif;?>
<?php
// サブクエリをリセット
wp_reset_postdata();
?>

 

ページ送りのリンクが上手く動作しないので修正する

元が固定ページなので単にWP_Queryで取得しただけで常に1ページ目となってしまい投稿の2ページ目などがうまく表示されません。何ページ目を表示するのかをWP_Queryに渡してサブクエリを取得してあげる必要があります。

先ほどのコードを修正します。

<?php // page.php ページテンプレート
// 何ページ目かを取得
// $pagedはglobal変数として存在するっぽいけど念のため
$paged = get_query_var('paged')? get_query_var('paged') : 1;

// サブクエリを作成
$the_query = new WP_Query(array(
  'post_type' => 'post',
  'posts_per_page' => 10,
  // 何ページ目を指定してサブクエリを取得する
  'paged' => $paged,
  'post_status' => 'publish',
));
if ( $the_query->have_posts() ) :
?>
  <?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
    // サブクエリで取得した投稿を表示させる場所
  <?php endwhile; ?>
  // WP-PageNavi
  <?php
    if( function_exists('wp_pagenavi') ) {
      // サブクエリを引数で渡してあげる
      wp_pagenavi( $the_query );
    }
  ?>
<?php endif;?>
<?php
// サブクエリをリセット
wp_reset_postdata();

これで、固定ページ内でサブクエリで取得した投稿のページ送りがWP-PageNaviプラグインでそのまま使えるようになりました。

本来カスタム投稿タイプを作ってarchiveテンプレートを作ったり、pre_get_postsを使って大本のクエリを変更してあげるのが良いのだと思うのですが、いろいろな事情で固定ページ内にサブクエリで投稿などを表示したいという案件もまだまだあるかと思いますので、メモ。その案件に当たったのです。


[参考]
wordpress.org

NEW GAME! (2) (まんがタイムKRコミックス)

NEW GAME! (2) (まんがタイムKRコミックス)