サイトがクラッシュした理由
PHP 8.0以降へのアップグレードはパフォーマンス向上に繋がりますが、古いコードにとっては重大な変更(破壊的変更)となります。画面が真っ白になったり、致命的なエラーログが表示されたりする場合、サイトが create_function() という古い関数に依存している可能性があります。この関数は、PHP 8.0で正式に削除されました。
Fatal error: Uncaught Error: Call to undefined function create_function() in /path/to/wp-content/plugins/old-plugin/filename.php:line_number
根本的な原因
PHP 7.2では、2017年にすでに create_function() が非推奨となりました。この関数は内部で eval() を使用しており、任意のコード文字列を実行できてしまうため、低速でセキュリティ上のリスクがありました。このリスクを排除するため、PHP 8.0でついにエンジンから削除されました。5〜6年前に書かれたプラグインやテーマがまだ有効な場合、PHP 8に切り替えた瞬間にサイトがクラッシュします。
ステップ 1:問題のあるコードを特定する
競合を引き起こしている特定のファイルを見つける必要があります。ブラウザに「致命的なエラー」という一般的なメッセージしか表示されない場合は、エラーログを確認するか、WordPressのデバッグモードを有効にする必要があります。これが「決定的な証拠」を見つける鍵となります。
wp-config.php ファイルを開き、以下の行を更新します。
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', true );
サイトを更新してください。エラーメッセージがファイルパス(通常は wp-content/plugins/ または wp-content/themes/ 内)を直接指し示すようになります。記載されているファイル名と行番号をメモしてください。
ステップ 2:すべてを更新する
コードを修正する前に、アップデートを確認してください。ほとんどの著名な開発者は、数年前にこの問題を修正済みです。Slider Revolution や LayerSlider といった人気プラグインの2018年版などを使用している場合、最新バージョンに更新するだけで即座に解決します。
- プレミアムツール: ThemeForestなどのマーケットプレイスにログインし、最新のPHP 8対応ファイルをダウンロードしてください。
- 放置されたプラグイン: 3年以上更新されていないプラグインは、セキュリティ上のリスクがあります。修正を試みるよりも、最新の代替プラグインへの移行を検討してください。
ステップ 3:匿名関数への手動リファクタリング
置き換えができないカスタムコードを使用している場合は、関数を書き換える必要があります。古い文字列ベースの create_function を、現代的なPHPの匿名関数(クロージャとも呼ばれます)に変換します。
例 1:シンプルなフィルターロジック
古いコード(エラー発生):
add_filter('excerpt_length', create_function('$a', 'return 25;'));
新しいコード(修正済み):
add_filter('excerpt_length', function($a) {
return 25;
});
例 2:引数を含む複雑なロジック
古いコード(エラー発生):
$new_func = create_function('$val', 'return my_custom_logic($val) . "_suffix";');
add_filter('some_hook', $new_func);
新しいコード(修正済み):
$new_func = function($val) {
return my_custom_logic($val) . "_suffix";
};
add_filter('some_hook', $new_func);
例 3:'use' を使った変数の受け渡し
create_function で最も厄介だったのは、外部変数の扱いでした。現代のPHPでは、use キーワードを使用して、それらの変数を関数のスコープに取り込みます。
古いコード(エラー発生):
$suffix = '_test';
add_filter('wp_title', create_function('$title', 'return $title . "' . $suffix . '";'));
新しいコード(修正済み):
$suffix = '_test';
add_filter('wp_title', function($title) use ($suffix) {
return $title . $suffix;
});
ステップ 4:検証とクリーンアップ
変更を保存した後、簡単なヘルスチェックを行います:
- キャッシュのクリア: サーバーキャッシュや WP Rocket などのプラグインのキャッシュをクリアします。
- サイトヘルスを確認: ダッシュボードの ツール > サイトヘルス に移動し、他のPHPエラーが残っていないか確認します。
- デバッグをオフにする: サイトが安定したら、ログが肥大化しないように
wp-config.phpのWP_DEBUGをfalseに戻します。
サイトの将来に備える
次のPHPアップデートで慌てないようにしましょう。ステージング環境を使用して、メジャーバージョンの移行(8.1から8.2への移行など)をテストしてください。ログに「Deprecated(非推奨)」の通知が表示された場合は、すぐに対処してください。これらの警告は、将来のメジャーリリースでその関数が削除されることを示す早期の兆候であり、サイトがクラッシュするストレスなしにリファクタリングを行うための十分な時間を与えてくれます。

