ブログ

カスタム投稿タイプのページネーション

ページネーションとはなんて手のかかる子なのかしら・・・。

やりたいこと

オリジナルの投稿と同じようにカスタム投稿にもページネーションを実装したい。

こまったこと

ページネーションがそこにあっても、ページネーションとしての機能を果たしていない。2ページ目以降に進めない。

カスタム投稿を表示するコード
<div class="">
    <?php
    $paged = ( get_query_var( 'paged' ) ) ? get_query_var( 'paged' ) : 1;
    $the_query = new WP_Query( array(
      'post_status' => 'publish',
      'post_type' => 'custompost', //カスタム投稿タイプ名
      'paged' => $paged,
    ) );
    if ( $the_query->have_posts() ):
      $html_top_result = '<div>';
    while ( $the_query->have_posts() ): $the_query->the_post();
    ?>
        <h3>
          <?php the_field('works_title') ?>
        </h3>
    <?php
    endwhile;
    $html_top_result .= '</div>';
    else :
      $html_top_result = '<div><p>ありません。</p></div>';
    endif;
    echo $html_top_result;
    ?>
  </div>
ページネーションを表示するコード
  <div class="pagination">
    <?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' => '?paged=%#%',
      'total' => $the_query->max_num_pages,
      'mid_size' => 1,
      'current' => ( $paged ? $paged : 1 ),
      'prev_text' => '< 前へ',
      'next_text' => '次へ >',
    ) );
    ?>
  </div>

それぞれをカスタム投稿一覧を表示する場所(固定ページなら page-●●.php ファイル)に書く。

コードのポイント

ページネーションコード15行目の

'format' => '?paged=%#%',

がポイントでした。

ページネーションでいろいろと検索したところ

 'format' => $paginate_format,

と書かれているものが多かったのですが、このformatだとページネーションとして機能しない・・・

format(15行目)を

'format' => '?paged=%#%',

に変更して、以下コードをfunction.phpに追記。

add_filter('redirect_canonical','my_disable_redirect_canonical');
 
function my_disable_redirect_canonical( $redirect_url ) {
	if ( is_archive() ){
		$subject = $redirect_url;
		$pattern = '//カスタム投稿タイプ名//'; // URLに「/カスタム投稿タイプ名/」があるかチェック
		preg_match($pattern, $subject, $matches);

		if ($matches){
		//リクエストURLに「/カスタム投稿タイプ名/」があれば、リダイレクトしない。
		$redirect_url = false;
		return $redirect_url;
		}
	}
}

デザインをcssで整えたら完璧さ!