こんにちはズマペンです。
とある会社さんのホームページで、2ページ目以降が表示されない(ページ送りが動作しない)という現象に悩まされたときに、何とか解決できたので備忘録的に書き溜めていきます。
※この記事は2020年2月26日に更新しました。
※なおWordPressのphpを編集する際は必ずバックアップを取るようにしましょう!
■状況: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ページ目が表示されると良かったのですが、
力不足というか知識不足で、今回は上記の回避策で落ち着きました。