何気なくWordfence Securityのタブを開いたら何やらエラーメッセージが出ていました。

このエラーメッセージは前にも見たことがあります。
何らかのエラーによって以降の処理が続行できないときによく出てきます。
早速調査していきましょう。
エラーログの内容
エラー調査の基本はサーバーのログを見ることです。
サーバーのエラーログを見ると下記のメッセージが出ていました。
PHP message: PHP Fatal error: Uncaught ValueError: scandir(): Argument #1 ($directory) cannot be empty in 〜
エラーメッセージの意味
上記のエラーメッセージはPHP 8.0で新たに追加された例外によるもののようです。
scandir関数の第一引数が空文字だったためにエラーとなったようです。
問題の箇所
エラーログに出力されていたファイル(wp-content/plugins/wordfence/lib/wfLog.php)の該当箇所を見てみると下記のようになっていました。
$path = untrailingslashit($path); $contents = @scandir($path);
untrailingslashit関数はWordPressのビルトイン関数で、引数の末尾のスラッシュもしくはバックスラッシュを削除する関数です。
削除後の文字列を第一引数としてscandir関数を呼び出しているのですが、ここでエラーが出ていました。
詳しく調べると、untrailingslashit関数の引数に指定している$pathには「/」が入っていたようです。
untrailingslashit関数の戻り値は空文字になり、それを第一引数としてscandir関数が呼ばれたことで上記例外が投げられたということのようです。
PHP 8.0よりも前であれば例外が投げられることはなく、更には「@」でエラー表示を抑制しているので見た目上は何事もなく処理が進んでいたと思われます。
PHP 8.0になって新たに追加された例外が投げられたことで処理が止まってしまい、今回の事象になってしまったようです。
対応
scandir関数の第一引数が空文字であることが例外の原因なので、空文字の時はscandir関数を呼ばないようにすれば大丈夫だと思います。
// for PHP 8.0 if (!$path) { return array(); }
エラーが出なくなって、以降の処理も問題なく行われているようです。

まとめ
今回エラーが出たのは当方の環境のせいであって、プラグイン側に問題はありません。
そもそも、WordPress本体もまだPHP 8.0を推奨していないので当方の環境がイレギュラーであることは否めません。
PHP 8.0対応が進めば徐々にこういったエラーは解消されていくと思われます。
この記事が一足早くPHP 8.0をお使いになっていて同様のエラーで困っている方の参考になれば幸いです。
コメント