WordPress 5.5でページネーションができなくなった場合の原因と対処法

 WordPressを使ったクライアントのサイトの1つで、「WordPress 5.5に更新した後にページネーションが効かなくなった」という不具合が報告され、調査した結果、コアの仕様変更による物だったので共有しておきます。

カスタムページネーションが効かない

 WordPressがコアで用意している下記のページ上の(というよりはメインクエリの)(一例)デフォルトページネーションは影響を受けません。

  • アーカイブ
  • カテゴリー
  • タグ
  • ホーム
  • カスタム投稿タイプのアーカイブ
  • カスタムタクソノミーのアーカイブ

 今回問題になっているのはWP_Queryクラスを使って表示する記事リストに用意するカスタムページネーションです。

 この問題はWordPressのコアフォーラムでも議論されており、これまではWordPressのURLクエリの1つに[page]を使うことが可能だったのですが、これができなくなったことで生じていました。

KAZU

しかも、これをリリースノートに書いてなくて大問題になりました。

HTML
www.example.com/example?page=offers&id=xxx

 このURLはクエリ文字列に[page]を使ってコンテンツの表示の制御を行っています。そのため、このやり方ではWordPress5.5からはカスタムページネーションの実装ができません。

KAZU

ちなみに、私の場合はカスタムページネーションでの問題でした。カスタムページネーションを実装する開発者はクエリに[page]を使うことがほとんどのことから、この問題に出くわす可能性が高いと言えます。

実際はカスタムページネーション独特の問題ではなく、クエリに[page]を使った実装は全て影響を受けるはずです。

解決策

 解決策は2つあります。1つは単純に[page]のクエリを変えて、リライトルールを書き換える方法です。これは、機能の作り直しにもつながりますし、場合によってはパーマリンクを変えなければならず、SEO対策も面倒かもしれません。

 そこで、別の解決方法を見つけました。

WordPress
function pre_handle_404($preempt, $wp_query) {
    if (isset($wp_query->query['page']) && $wp_query->query['page']) {
        return true;
    }

    return $preempt;
}
add_filter( 'pre_handle_404', 'pre_handle_404', 10, 2 );

 このコードを読み込んでください。今回の問題は、WordPressコアが[page]クエリがついている時、開発者の動作を無視してリダイレクト処理を行う実装を追加したのが原因です。これを解除し、WordPress 5.4以前の状態に戻します。

 これは、WordPressコアの新しいルールを拒否することに繋がるので、ベストプラクティスとは言えませんが、WordPressコアが今後のリリースで、[page]クエリを使った新しい機能を実装しない限りは安全と言えます。