固定ページにページネーション機能を持たせる

WordPressに長く携わっていると、固定ページで一覧表示してページネーションまでしたい、という場面がよく出てきます。
一覧表示はともかく、ページネーションまでしようとなるとひと工夫が必要です。
そこで、例として「services」というカスタム投稿タイプの記事の一覧を固定ページに出して、なおかつページネーションまでさせる方法を紹介します。

まず、その固定ページ用の専用テンプレートを作りましょう。
たとえば固定ページのスラッグが arekore だとすると、
WordPressのルールで、page-arekore.php を用意してあげれば、デフォルトテンプレートの page.php ではなく page-arekore.php を読み込んでくれます。

page-arekore.php に以下のように記述します。

<?php
 
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
 
$the_query = new WP_Query( array(
  'post_status' => 'publish',
  'post_type' => 'services', //カスタム投稿タイプ名
  'paged' => $paged,
  'posts_per_page' => 30, // 表示件数
  'orderby'     => 'date',
  'order' => 'DESC'
) );
 
 
if ($the_query->have_posts()) :
 
  $html_top_result='<div>';
 
  while ($the_query->have_posts()) : $the_query->the_post();
 
    //ルーチン処理記述
 
  endwhile;
 
  $html_top_result .= '</div>';
 
else :
  $html_top_result = '<div><p>ありません。</p></div>';
endif;
 
echo $html_top_result;
?>
<div class="pnavi">
<?php //ページリスト表示処理
global $wp_rewrite;
$paginate_base = get_pagenum_link(1);
if(strpos($paginate_base, '?') || ! $wp_rewrite->using_permalinks()){
  $paginate_format = '';
  $paginate_base = add_query_arg('paged','%#%');
}else{
  $paginate_format = (substr($paginate_base,-1,1) == '/' ? '' : '/') .
  user_trailingslashit('page/%#%/','paged');
  $paginate_base .= '%_%';
}
echo paginate_links(array(
  'base' => $paginate_base,
  'format' => $paginate_format,
  'total' => $the_query->max_num_pages,
  'mid_size' => 1,
  'current' => ($paged ? $paged : 1),
  'prev_text' => '< 前へ',
  'next_text' => '次へ >',
)); ?>
</div>

ポイント:
① 3行目でページ番号を取得してます。
② 5行目:クエリ関数は WP_Query を使うこと。上記のような記述では他のクエリ関数だとうまくいきません。
③ 34行目から下のページリスト表示処理の部分は割と汎用的なので、上のコードをコピペで使えます。
 ただし、パーマリンク設定をいじっていたりするとうまく動かない場合があるので、
 その場合は「FV Top Level Categories」というプラグインをインストールしておくと解決するかもしれません。
④ 49行目の’total’ => $the_query->max_num_pages の $the_query は取得した配列の変数名を入れてください。
 
 
ただし、実はこれをしても、トップページに設定した固定ページではページネーションができません。