西宮でホームページ制作やワード/パワーポイントでの企画書・提案書をSOHOで制作しています

WordPress:カテゴリアーカイブにカスタム投稿タイプも追加した一覧ページでページングにハマった

ニュースカテゴリの一覧ページを作成していて、そこにカスタム投稿タイプの記事一覧もあわせて表示させました。
クエリ自体は問題がなくposts_per_page=-1にすれば、すべてが取得できています。

しかし、ページ送りをしようとすると2ページ目以降でページがありません、と404が返ってきてしまうという症状で悩みました。

ページ送りは、よく使っているこちらのコード。

WP-PageNavi を使わずにナビゲーション表示 (改良版)

で、今回はそれをfunctions.phpに置くのを使わせていただきました。
ページナビゲーション機能を改版してみたり

このコードは通常のカテゴリ一覧などでこれまでに何度も使用しているので、問題ないはずなのですが、カスタム投稿タイプが絡んでるのが原因なのかよくわからないのですが、2ページ目以降で404。ただposts_per_pageの値をいじってみるとどうやらページ数はちゃんと合っています。

それで、結論から言えば、パーマリンクの/category/news/page/2/などと表示されるものを/category/news/?page=2と変えたらいけました。

試したけど今回効果がなかったものは、

Top Level Categories Fixプラグイン
Custom Post Type Category Pagination Fix
・表示設定の「1ページに表示する最大投稿数」を1にする

などです。

先の吟遊詩人さんのコードがこれ

function bmPageNavi() {
  global $wp_rewrite;
  global $wp_query;
  global $paged;
 
  $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 .= '%_%';
  }
 
  $result = paginate_links( array(
    'base' => $paginate_base,
    'format' => $paginate_format,
    'total' => $wp_query->max_num_pages,
    'mid_size' => 5,
    'current' => ($paged ? $paged : 1),
  ));
 
  return $result;
}

そして、最終的にfunctions.phpにかいてあるコードはこれです。

function bmPageNavi() {
  global $wp_rewrite;
  global $wp_query;
  global $paged;

  $paginate_base = get_pagenum_link(1);
  if (strpos($paginate_base, '?') || ! $wp_rewrite->using_permalinks()) {
    $paginate_format = '';
    $paginate_base = add_query_arg('page', '%#%');
  } else {
    $paginate_format = (substr($paginate_base, -1 ,1) == '/' ? '' : '/') .
    untrailingslashit('?page=%#%', 'paged');;
    $paginate_base .= '%_%';  
  }

  $result = paginate_links( array(
    'base' => $paginate_base,
    'format' => $paginate_format,
    'total' => $wp_query->max_num_pages,
    'mid_size' => 5,
    'current' => ($paged ? $paged : 1),
  ));

  return $result;
}

微妙に変わってます。
9行目と13行目だけか。。あんなにもがいたのに。
まぁ意図どおりに動かせたので良しです!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です