こんにちはズマペンです。
とある会社さんのホームページで、2ページ目以降が表示されない(ページ送りが動作しない)という現象に悩まされたときに、何とか解決できたので備忘録的に書き溜めていきます。

※この記事は2020年2月26日に更新しました。
※なおWordPressのphpを編集する際は必ずバックアップを取るようにしましょう!

2ページ目以降が表示されない



 

■状況:2ページ目以降が表示されない!

・WordPressのブログを運用中。
・ブログ一覧ページから、2ページ目移行を見ようとしても表示されない。
・ページネーションのリンクURLがexample.com/blog/page/2/という形式。
・カスタム投稿を入れていて、パーマリンクの設定を変更していた。


 

■仮説:怪しいと思ったところ

・そもそも2ページ目は存在している?
・もし2ページ目が存在しているなら、ページネーションのexample.com/blog/page/2/というリンクURLに問題あり?


 

■原因:なぜ!?WordPressのページネーションが動作しないのか

・2ページ目の一覧ページ自体は存在していた!
試しにパーマリンクの設定を基本に戻してみたところ、普通にページネーションが動作しました。
example.com/blog/page/2/ ⇒ example.com/?cat=1&paged=2 で見れました。

もしかしたら、本来はこれだけで解決するのかもしれないです。
自分の場合は、他のカスタム投稿のURLとの兼ね合いで、パーマリンクの設定の【基本】は使えない状況でした。

・原因はページネーションのリンクURLに問題あり
先ほどのパーマリンクの設定を再度カスタム構造に戻すと、ページネーションのURLはexample.com/blog/page/2/というリンクに戻りました。
なので、このページネーションのリンク先をexample.com/?cat=1&paged=2の形式にする必要がありました。

・またリダイレクトも解除しないといけない
また、パーマリンクの設定がカスタム構造の状態のままでexample.com/?cat=1&paged=2にアクセスしてもexample.com/blog/page/2/にリダイレクトされてしまいました。
これも解除しないといけませんでした。



 

■解決:なんとか回避した方法

ページネーションのURLを改変
まず、ページネーションのURLをexample.com/?cat=1&paged=2形式に変更します。
下記コードをページネーションを置きたい場所に記載。

※参考:https://teratail.com/questions/130276

ポイントは2つ。
①URLが/blog/の時は「format」で「../?cat=1&paged=%#%」を指定
②その他の場合は「format」で「&paged=%#%」を指定



<?php // **** ページナビゲーション **** ?>

<div id="pageNavi">
<?php $url = $_SERVER['REQUEST_URI']; ?>
<?php if(strstr($url,'blog')): ?>


<?php 
$paged = (int) get_query_var('paged');
$category = get_the_category();
$category = $category[0];
$args = array(
    'cat'=> $category->cat_ID,
    'posts_per_page' => 10,
    'paged' => $paged,
    'orderby' => 'post_date',
    'order' => 'DESC',
    'post_type' => 'post',
    'post_status' => 'publish'
);
$the_query = new WP_Query($args);

if ($the_query->max_num_pages > 1) {
 echo paginate_links(array(
 'base' => get_pagenum_link(1) . '%_%',
 'format' => '../?cat=1&paged=%#%',
 'current' => max(1, $paged),
 'total' => $the_query->max_num_pages
 ));
}
 ?>

<?php wp_reset_postdata(); ?>


<?php else: ?>

<?php 
$paged = (int) get_query_var('paged');
$category = get_the_category();
$category = $category[0];
$args = array(
    'cat'=> $category->cat_ID,
    'posts_per_page' => 10,
    'paged' => $paged,
    'orderby' => 'post_date',
    'order' => 'DESC',
    'post_type' => 'post',
    'post_status' => 'publish'
);
$the_query = new WP_Query($args);

if ($the_query->max_num_pages > 1) {
 echo paginate_links(array(
 'base' => get_pagenum_link(1) . '%_%',
 'format' => '&paged=%#%',
 'current' => max(1, $paged),
 'total' => $the_query->max_num_pages
 ));
}
 ?>

<?php wp_reset_postdata(); ?>

<?php endif; ?>
</div>

<?php // **** END ページナビゲーション **** ?>




 

ただし、これだけでは不十分!!
せっかくページネーションのリンクURLをexample.com/?cat=1&paged=2になるように変えても、
WordPressの機能で、自動リダイレクトがかかってしまうため、example.com/blog/page/2/に自動遷移してしまいます
=結局見れない状態ということが判明!

URLで特定の文字列(今回はpage)を含んだ場合はリダイレクトしない設定を追加して解決しました!
function.phpに下記コードを記載。
※参考:https://teratail.com/questions/130276



<?php 

add_filter('redirect_canonical','my_disable_redirect_canonical');

function my_disable_redirect_canonical( $redirect_url ) {

    if ( is_archive() ){
        $subject = $redirect_url;
        $pattern = '/\/page\//'; // URLに「/page/」があるかチェック
        preg_match($pattern, $subject, $matches);

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

 ?>




 

■まとめ

まずは、ページネーションのURLを2ページ目が表示されるURLに変更。
次に、リダイレクトされないようにfunction.phpに設定。

理想は、example.com/blog/page/2/という形式のまま、2ページ目が表示されると良かったのですが、
力不足というか知識不足で、今回は上記の回避策で落ち着きました。



 

この記事を書いた人



上級ウェブ解析士 水間 祐平

上級ウェブ解析士 水間 祐平
出身:千葉県千葉市
資格:上級ウェブ解析士・産業カウンセラー
趣味:映画鑑賞、スポーツ観戦、草野球

中小企業を専門に合計400サイト以上のホームページの運用・分析を担当。現在も常時100サイト以上のアクセス解析を行い、数値データから導き出す改善提案で、多くの成功事例を生み出している。また、企業のWeb・広報担当者向けにアクセス解析のセミナー研修を行っている。