PHP8へのバージョンアップで重大なエラー発生 原因のInvisible reCAPTCHA のエラーをド素人が解決
PHP7.4CGI版を使っていたのですが、レンタルサーバ会社から7.4のモジュール版の方がなくなるとの通知があり、いよいよ7.4はCGIでもモジュール版であってもそろそろPHP8に変えないとまずいなと思いました。
今までWordPressとPHPのバージョンアップには、テーマとプラグインが最新かどうか確認にしてから進めるようにしてはいました。(日頃から最新にするようにはしていますが・・・。)
今までバージョンアップは問題なく、すんなりと更新することが出来ていましたが、今回のPHP8はそうはいきませんでした。
▲ はじめにお断りを
本当に、当方ド素人ですので、この件についてのお問い合わせ、ご質問は申し訳ありませんがご遠慮お願いします。
分野外の当方がこのような記事を書くとは思ってもいませんでしたが、ド素人がしたことを書いた内容はきっとド素人さん(失礼です)にも少しでも役に立つ!?と記録しておきたいと思ったからです。
それでは、本題です。
いつもの更新のようにサーバーでPHP7.4CGIからPHP8 CGI版に変更しました。約5分経過後にサイトをみると「このサイトで重大なエラーが発生しました」と出て、ログイン画面も同じ表示が出てしまいました。いよいよ自分にもこのような行き詰まりの時が来てしまったか…と。
この時は慌てて、もとのPHP7.4CGIに変更し元に戻りましたが…。
・・・さて、どうするか?
当方本当にテーマやWordPressのプログラムなんかは、まったくのド素人です。
こうなると、ネットの諸先輩方の残しておられるサイト情報や、WordPressのフォーラムを見ることになるのです。
まずは、テーマとプラグインを分けて確認する。
確率的にプラグインが多い様子なので、入れているプラグインのどれかが怪しいのかも。
調べるその前に・・・
テストや確認で都度、エラー画面が出ると恥ずかしいので、訪問されている方がいないのを見計らってWordPress管理画面左下の「WPセキュリティ」の「メンテナンス」を選択し、メンテナンス画面に切り替えます。
メンテナンスを選択したら画面上にある「管理者としてログインしているユーザーを除くすべての訪問者をサイトのフロントエンドから締め出すようにする場合、これをチェックします。」これにチェックを入ます。入れないとエラー画面がサイト訪問の方に見えてしまいます。
次に、訪問の方が安心できるような「ただいまメンテナンス中です。」などと入れておきます。
最後に一番左下の「サイトのロックアウト設定を保存する」をクリックしたら即メンテナンス画面になります。
こうすることでテスト中に裏(管理画面)で何が起こっていても、訪問された方には「メンテナンス中」という画面しか見えません・・・。
解除は、「管理者としてログインしているユーザーを除くすべての訪問者をサイトのフロントエンドから締め出すようにする場合、これをチェックします。」のチェックを外して、左下でメンテナンス中にする時に押した「サイトのロックアウト設定を保存する」をクリックすれば、メンテナンスが解除され即サイトが表示されます。
では、プラグインの無効化を1つづつ確認して行きますが、入れているプラグインの詳細を見て「このWordPressバージョンではテストされていません。」とか、更新が半年以上されていないようなプラグインから無効化してみましたが相変わらず「このサイトで重大なエラーが発生しました」と出てしまいます。
でもこうやって、プラグインの無効化を1つ1つ確認して行くのは面倒なので、プラグインが原因なのかを見極めるために、プラグインを全部停止することにしました。
サーバーのFTPで、 wp-content/plugins/の名前を一時的に 適当にplugins-Aと変えて、PHP8へ変更するとまたもや、「このサイトで重大なエラーが発生しました」と出てしまいました。
そうなるとテーマーか・・・
使っているテーマではネット上では問題になっている様子がない・・・。
でも念のため、WordPressのデフォルトテーマに切替えてPHP8にしてみると・・・
うーん、ダメでした。テーマが原因でも調べるのが大変なのでテーマは大丈夫と安心はする。
テストサイトでもおなじプラグインとテーマでPHP8には出来ているのですが、運用サイトとは設定が異なるので何とも言えません。
こうなると、自分にはお手上げの世界です。
どこかのphpファイル中で自分が置いたコードがおかしいのでしょうか…。
ここで、くわしい方からすると、問題が起きたら来る「技術的な問題が発生しています」というメールが来てないの?と思われたでしょう。そうです。WordPressを始めたころは未熟で何かやらかして来たような記憶はあるのですが、それからは幸いにも重大な問題が発生していなくてそのようなメールが来ることを忘れていました。
しかし、今回のような重大なエラーが起きたのに来ないのです。
そこで、デバックモードにしてログを習得してみます。
しかし、「wp-config.php」ファイルをみても、どこにもデバックモードに関するコードがない。
ないなら貼り付けるか・・・
と隣に「wp-config-sample.php」という何かわからないファイルがあったので、保存も兼ねてサーバーよりダウンロードしてビューソフト「TeraPad」で覗いてみると・・・ ありました。
「* 開発者へ: WordPress デバッグモード*」で始まるところが。
これは過去のいつかのWordPressのバージョンアップでこのsampleファイルに移動したのだろうか?
このサンプルファイル「wp-config-sample.php」で記述しても効かないと思い、正しい「wp-config.php」ファイルの
/* 編集が必要なのはここまでです ! WordPress でのパブリッシングをお楽しみください。 */
の直前に下記を入れました。
// デバッグモードを有効にする true 無効にするが false
define( 'WP_DEBUG’, true );
// デバッグ情報ログ出力を true 有効にする
define( 'WP_DEBUG_LOG’, true );
// エラーと警告の画面表示を無効にする
define( 'WP_DEBUG_DISPLAY’, false );
@ini_set( 'display_errors’, 0 );
こうして、PHP8に更新しようとしてエラーが発生したのでメールが来ました。どうやらデバックモードのコードがなかったからメールが来なかったのかもしれません。ついでに解決出来てよかったです。
そのメールにはデバックモードへのリンクとエラー内容が記載されていて、これはサイト管理者の生命線です。
こんな大事なことが今まで無効な状態でした。重大な問題が起きてなく良かったものの・・・危なかったです。
まずは、デバックモードで出るログを見ます。ログファイルの名前は、「debug.log」 場所は、/wp-content 下に出来ます。
▲ログが出来たら、安全のためデバックモードは無効に戻しておきましょう。
ログの中を見て一番は「警告」と出ているのを対処しなければ改善しない様子です。
警告されている部分です。(赤字にしているのは場所です。)
PHP Warning: The magic method InvisibleReCaptcha\MchLib\Plugin\MchBasePublicPlugin::__wakeup() must have public visibility in /wp-content/plugins/invisible-recaptcha/includes/plugin/MchBasePublicPlugin.php on line 37
MchBasePublicPlugin.phpファイルの37行目と言われている。
やはり、ネットでも情報があったプラグイン「Invisible reCaptcha」に問題だったか。更新も随分されておりませんし・・・。でもなぜプラグイン全停止をしても、重大なエラーが発生したのでしょう?よくわかりません…。
それはもう置いといて、何が悪いのかというのは、
「InvisibleReCaptcha \ MchLib \ Plugin \ MchBasePublicPlugin :: __ wakeup()は、/ home /users/で公開されている必要があります。」
何のことかわからないのでネットで調べると、Invisible reCaptchaについてWPフォーラムに海外の方のこんなやり取りがあった。
private function __wakeup()
を、
public function __wakeup()
にするそうで。
でも、これはこのプラグイン Invisible reCaptcha に更新があったら書き換えた部分が元に戻ってしまうのか? もし今後更新があったら要注意です。
「MchBasePublicPlugin.php」ファイルの最下行にある「private」を「public」に変えて、またPHP8へ更新してみる・・・
するとあの、重大なエラーが・・・」で出なくなりました。成功したぁ・・・
と、念のため別の端末でログインできるか操作すると・・・
あれっ、ログイン後に出てしまいました。「重大なエラーが・・・」と。
・・・もうあきらめか。
更新がずっとない「Invisible reCaptcha」の更新を待つのも・・・。
と別のプラグイン「AdvancedGooglereCAPTCHA」で試したのですが、PHP8への更新はできたものの、「Invisible reCaptcha」がログイン画面にも問い合わせフォームにも出ず、そしてログインも成立しなかったので、使わないことにしました。
翌日...
昨夜の更新テストで発生したエラーで「技術的な問題が発生しています」メールを、昨夜は遅い時間になって見ていなかったので見ると・・・(赤字にしているのは場所です。)
「エラータイプ E_COMPILE_ERROR が /wp-content/plugins/invisible-recaptcha/includes/utils/MchIPUtils.php ファイルの 197 行目で発生しました。
エラーメッセージ: Array and string offset access syntax with curly braces is no longer supported」
メッセージを訳すると、
「中括弧付きの配列と文字列のオフセットアクセス構文は非推奨」だって。
MchIPUtils.php ファイルを見てみると、いたるところに{ があるけど・・。
こうなったら、PHP8の更新はできるようになっているので、
あとは管理者(自分)が、Invisible reCaptchaでログインができるようするだけです。
エラー内容から、phpファイルを修正してInvisible reCaptcha の重大なエラーを消すことを目指します。
言われた「中括弧付きの配列と文字列のオフセットアクセス構文は非推奨」について、またもネットで調べる。
非推奨って言っても、使えないなら禁止ですよね。と思いながら…
すると、国内の方と海外の方のサイトで中括弧付きについて見つけたのが、
PHP8では、
{ は使えず [ に変える そうで、
例えば、
echo($str{0});
を、
echo($str[0]);
と変えるのだと・・・。
そこで、エラーで指摘のあった「MchIPUtils.php 」ファイルの 197 行目をビューソフト「TeraPad」で見るも、見当たらず、近くの215行目に怪しいのがありました。
215行目 // array('/(?::?\b0+\b:?){2,}/’, '/\b0+([^0])/e’),
変更は、{2,}→ [2,]
このファイル全域検索すると、
227行目 while ($seg {0} == '0’)
変更は、{0}→ [0]
752行目 return substr(preg_replace(“/([A-f0-9]{4})/", “$1:", $hexMask), 0, -1);
変更は、{4}→ [4]
とあったので試しに3点とも変えました。これも、もし今後プラグイン Invisible reCaptcha に更新があったら元に戻ってしまうかもしれないので要注意の部分です。
そしたら、ログインできるようになりました。
エラーメールも来ないし、サイトヘルスにも致命的なエラーは出ていませんし、PHP8になっていることも確認できました。サイト表示も問題ないです。
おそらく Invisible reCaptcha は機能しているはず・・・。
もちろんお約束ですが、この対応につきましてはくれぐれも自己責任でお願い致します。
👉 2022.12現在 この問題解決時のPHP8.0からPHP8.1へのバージョンアップでもこの件による問題は起きておりません。
コメントをどうぞ