【PHP 8系アップデート×WordPress】「この Web サイトに重大なエラーが発生しました。」の対応をした話(IP Geo Block)
こんにちは、コル(@bravecol)です。
今回はWordPressネタ。PHP8系にアップデートして遭遇した「この Web サイトに重大なエラーが発生しました。」というエラーに対応した話です。
エラーに遭遇したきっかけ
PHPバージョンアップしたらログインできなくなり対応することになった、というのがきっかけです。
運営中のWordPressサイトがありまして、ダッシュボードの画面で下記のように「PHPの更新を推奨」という表示が出てました。

そこそこ放置していた私が悪いのですがセキュリティに関することなので、言われるがままPHPバージョンを下記の通りあげました。
- PHP7.4.33 → PHP8.3.21
そして翌日、WordPress管理画面にログインしようとしたら下記画面に遭遇!
管理画面にログインできないので対応を余儀なくされました。


「重大なエラー」とかいきなり見ると驚くよねー
原因調査
はい、では原因調査をやっていきます。

やることはいつも通りエラー文を読むところから。
プログラムって地道ですよねホントに。
エラー「Array and string offset access syntax with curly braces is no longer supported in xxx on line xxx」
明確にエラー文とどのファイルの何行目が悪いのか書いてあるのでまずは原因を調べます。
このエラー文で調べるとすぐに分かりました。
Fatal error: Array and string offset access syntax with curly braces is no longer supported in xxx on line xxx
原因は「PHP 7.4以降で配列の波括弧が使えなくなった」ということらしい。
簡単に記載すると下記のとおり。
- value{0} → この記法が禁止された
- value[0] → この記法は使用可能
そして私の場合「wp-content/ip-geo-api/ip2location/IP2Location.php」とあり、プラグイン「IP Geo Block」をインストールした覚えがあったためこのプラグインが起因していることが分かりました。
IP Geo Blockの原因箇所
「wp-content/ip-geo-api/ip2location/IP2Location.php」の該当ファイルを開きまして、私の相棒「VSCode」ちゃんに貼り付けそれらしい箇所を検索。
どうやら382行目、385行目の2箇所が該当するようです。

ちなみにもしXServerで運用されている場合、下記のファイルマネージャーというところからエラーメッセージのパスを辿ればファイルの中身の確認と編集もできます。

対応調査
原因箇所は判明したので次はどう対応するか検討します。
IP Geo Blockの対応調査
原因箇所はわかってもプラグインファイルのため「直接編集してもアップデートされたら意味ないやん」と感じて対応方法を模索したところ
「最終更新7年前だと…」
という事実に直面。。。

どうやら下記2サイトを見る限り「IP Geo Block」をベースに問題点などを改善した「IP Location Block」という後継のプラグインがあり今はそちらがアップデートされている様子。
- IP Geo Block: https://ja.wordpress.org/plugins/ip-geo-block/
- IP Location Block: https://ja.wordpress.org/plugins/ip-location-block/

IP Geo Blockのエラー対応
根本的には「IP Geo Block」から後継の「IP Location Block」に移行することが必要です。
しかし、プラグインが更新されないということは管理画面にログインできないことには先に進みません。そこで下記2択が咄嗟に思いつきました。
- PHPバージョンを動作するバージョンへ下げる
- プラグインファイル直修正
他のプラグインへの影響とどっちみち後継の「IP Location Block」に移行するため修正しても問題なかろうと感じ、結果私は「2.プラグインファイル直修正」を選びました。
(修正箇所2箇所と分かっていますし、最悪バックアップ取っておけば元には戻せます^^)
先ほどの382行目、385行目の2箇所を下記の通り変更しました。
f_value{1}→f_value[1]に変えただけです。
(もし変更する際は念のため編集前にファイルコピーしてバックアップ取っておきましょう)
if ($f_value[1] == '*') {
$repeater = count($ar) - $i;
}
if ($f_value[0] != 'd') {
$i += $repeater;
continue;
}
上記で保存し、いざ管理画面へアクセス!
無事にログイン画面が出ました。

「IP Geo Block」から「IP Location Block」へ切り替え
無事管理画面にログインできるようになったため「IP Geo Block」から後継の「IP Location Block」へ切り替えておきます。変更手順は下記の通りです。
- 「IP Geo Block」を無効化
- 「IP Location Block」をインストール
- 「IP Location Block」を有効化
- 「IP Location Block」に「IP Geo Block」の設定内容を移行
- 「IP Geo Block」を削除
変更手順に関しては「IP Location Block」のプラグインサイトより下記ブログがわかりやすいため参考にさせていただきました。

またプラグインサイトにもありますが”Migrate from IP Geo Block”という設定を移行する項目が表示されるらしく「IP Geo Block」を消すのは最後が良さそうです。
「IP Geo Block」を無効化
プラグインのタブで「IP Geo Block」を無効化します。

「IP Location Block」をインストール&有効化
「IP Location Block」を検索し、インストールしていきます。
インストール完了したら有効化しましょう。

「IP Location Block」に「IP Geo Block」の設定内容を移行
有効化したら設定から「IP Location Block」に「IP Geo Block」の設定内容を移行していきます。

設定を開くと最下部あたりに「IP Geo Blockから移行する」欄があるので押してみましょう。
下記のような通知が見れます、この操作で移行は完了するようです。
無事完了したら古いプラグイン「IP Geo Block」を削除しておきます。

まとめ
以上、WordpressをPHP8.x系へアップデートした際の「この Web サイトに重大なエラーが発生しました。」に対するエラー対応でした。
私の場合は「IP Geo Block」起因だという結果になりました。
- インストール済みWordpressプラグインはたまに更新頻度確認を推奨
- 「IP Geo Block」はPHP8.x系では使えないため「IP Location Block」に移行
PHPバージョンアップ(特に7.xから8.xなどメジャーバージョンアップ)は気をつけないといけないですね。
この記事が同じような事でお困りの方の助けになれば幸いです。ご一読ありがとうございました。