WordPressサイトをPHP 8.3へバージョンアップした際、「記事を投稿・保存しようとすると一瞬だけ画面全体に警告メッセージ(Warning)が表示される」という現象に遭遇しました。
投稿処理自体は正常に完了するものの、運用上不安を与えるため、原因の特定と修正を行いました。同様の事象でお困りの方向けに、原因と具体的な解決手順を共有します。
発生した現象
WordPressの管理画面から記事を保存した際、画面遷移の途中で一瞬以下のようなメッセージが表示される。
Warning: Undefined array key "adman_edit" in /home/xxx/public_html/wp-content/plugins/new-adman/new-adman.php on line 125
Warning: Undefined variable $extra_msg in /home/xxx/public_html/wp-content/plugins/wordpress-ping-optimizer/cbnet-ping-optimizer.php on line 505
投稿処理自体は成功するものの、画面が一瞬真っ白になり生の警告ログが露出してしまう状態でした。
原因
要因は大きく分けて2点ありました。
PHP 8.x における厳格化(未定義キー・変数の警告)
PHP 7.x時代には警告が出なかった(あるいは軽視されていた)コードにおいて、存在しない配列キー(Undefined array key)や未定義の変数(Undefined variable)へアクセスした際、PHP 8.0以降では明示的にWarningが吐き出されるようになりました。
サーバー環境の display_errors 設定が On になっていた
wp-config.php 側の WP_DEBUG が false に設定されていても、サーバー環境(php.ini)側で display_errors = On が有効化されていると、発生したWarningがそのままブラウザの画面上にレンダリングされてしまいます。
解決手順
1. 本番環境でのエラー画面表示を抑制(wp-config.php)
まずはユーザーや管理者の画面に生の警告メッセージが出ないよう、画面表示の抑制を確実に行います。
wp-config.php の define(‘WP_DEBUG’, false); が記述されている付近に、以下の設定を追加します。
// WP_DEBUGの設定の下付近に追加
define('WP_DEBUG_DISPLAY', false);
@ini_set('display_errors', 0);
これにより、サーバー側の php.ini で display_errors が有効になっていても、WordPress上で発生した警告メッセージがブラウザ画面に出力されるのを防ぎます。
2. プラグイン側の未定義キー・変数ガード(PHP 8対応)
表示を消すだけでなく、根本的な原因となっている古いプラグインコードにNull合体演算子(??)や初期化処理を追加します。
① new-adman の修正 (new-adman.php)
配列キー adman_edit がセットされていない場合に警告が出るため、Null合体演算子 ?? ” を使用して安全にフォールバックさせます。
// 変更前
$adman_edit = $_POST["adman_edit"];
// 変更後(Null合体演算子で保護)
$adman_edit = $_POST["adman_edit"] ?? '';
② wordpress-ping-optimizer の修正 (cbnet-ping-optimizer.php)
変数 $extra_msg が条件分岐の中で宣言・初期化されないまま参照されていたため、処理の直前に空文字で初期化を行います。
// 該当処理の直前で変数を初期化
$extra_msg = '';
// または Null合体代入
$extra_msg = $extra_msg ?? '';
修正後の検証
構文チェック:php -l コマンドで構文エラー(Parse Error)がないことを確認。
パーミッション確認:変更したファイルのパーミッションが 644 に保持されているか確認。
ログ確認:修正後、記事投稿時にエラーログへ該当のWarningが記録されなくなったことを確認。
まとめ
PHP 8.3へのアップグレード時は、Fatal Error(サイト全停止)だけでなく、画面表示設定に起因する「一瞬だけ出るWarning」にも注意が必要です。
- 本番環境では WP_DEBUG_DISPLAY と display_errors をオフにする
- 古いプラグインの未定義アクセス箇所には ?? ” などのガードを入れる
この2点を押さえておくことで、表示崩れやユーザーへの不快感を与えずに安全なPHP 8.3運用が可能になります。
