2026年10月29日

2026年10月29日

WordPressのPHPバージョンエラーを解決する方法

はじめに

WordPressの管理画面に「サイトで技術的な問題が発生しています」と表示されPHPのFatal errorが原因だとわかった・サーバーをPHP8.0にアップグレードしたら一部のプラグインが動作しなくなった・Deprecated: Function xxx is deprecatedという警告がページ上部に大量に表示される・wp-config.phpでWP_DEBUGを有効にしたら古いPHP関数の警告が出て画像アップロードができなくなったといった問題は、プラグイン・テーマのPHP8非対応・非推奨関数の使用・型の厳格化による既存コードの破壊が原因です。

症状・原因

  • PHP8にアップグレード後にCall to undefined functionやArgument #1 must be of type stringエラーが発生する
  • 旧来のPHP5.x/7.xコードで使われていたereg()・split()・mysql_*()関数がPHP8で削除されエラーになる
  • PHP8の厳格な型チェックによりnullが渡された箇所でFatal errorが発生する
  • WordPressが推奨するPHPバージョンに対してサーバーのバージョンが古すぎて新機能が使えない

解決手順

ステップ1:PHP環境とエラーを診断する

# WP-CLIでPHP環境を確認
wp eval "
echo 'PHP version: '       . PHP_VERSION . PHP_EOL;
echo 'PHP SAPI: '          . PHP_SAPI . PHP_EOL;
echo 'Memory limit: '      . ini_get('memory_limit') . PHP_EOL;
echo 'Max execution time: ' . ini_get('max_execution_time') . PHP_EOL;
echo 'Error reporting: '   . ini_get('error_reporting') . PHP_EOL;
echo 'display_errors: '    . ini_get('display_errors') . PHP_EOL;

// WordPress推奨PHPバージョン確認
\$min_php = '7.4';
\$rec_php = '8.2';
echo 'Meets minimum (' . \$min_php . '): ' . (version_compare(PHP_VERSION, \$min_php, '>=') ? 'yes' : 'NO') . PHP_EOL;
echo 'Meets recommended (' . \$rec_php . '): ' . (version_compare(PHP_VERSION, \$rec_php, '>=') ? 'yes' : 'NO') . PHP_EOL;
"

# プラグインのPHP互換性を確認
wp plugin list --status=active --format=json | wp eval-file - <<'PHP'
<?php
$plugins = json_decode(file_get_contents('php://stdin'), true);
foreach ($plugins as $plugin) {
    $data = get_plugin_data(WP_PLUGIN_DIR . '/' . $plugin['name']);
    echo $plugin['name'] . ': requires PHP ' . ($data['RequiresPHP'] ?: 'unknown') . PHP_EOL;
}
PHP

# PHPエラーログを確認
wp eval "
\$log_file = ini_get('error_log');
if (\$log_file && file_exists(\$log_file)) {
    \$lines = array_slice(file(\$log_file), -20);
    foreach (\$lines as \$line) {
        if (str_contains(\$line, 'Fatal') || str_contains(\$line, 'Deprecated')) {
            echo \$line;
        }
    }
}
"

ステップ2:php.iniとWordPressのエラー設定を修正する

// wp-config.php: エラー表示設定
// 本番環境: エラーを非表示にしてログに記録
define('WP_DEBUG',         false);
define('WP_DEBUG_LOG',     true);   // wp-content/debug.log に記録
define('WP_DEBUG_DISPLAY', false);  // 画面に表示しない
ini_set('log_errors',      'On');
ini_set('error_log',       WP_CONTENT_DIR . '/debug.log');

// 開発環境: エラーを表示
// define('WP_DEBUG',         true);
// define('WP_DEBUG_LOG',     true);
// define('WP_DEBUG_DISPLAY', true);
// define('SCRIPT_DEBUG',     true);  // 非圧縮JS/CSSを使用
; php.ini または .user.ini: PHP設定
; 共有ホスティングは .user.ini をWordPressルートに配置

memory_limit = 256M
max_execution_time = 300
upload_max_filesize = 64M
post_max_size = 64M
max_input_vars = 3000

; エラー出力設定
display_errors = Off
log_errors = On
error_reporting = E_ALL & ~E_DEPRECATED & ~E_NOTICE

; PHP8推奨設定
default_charset = "UTF-8"

ステップ3:PHP8非互換コードを修正する

// PHP7以前のコード → PHP8対応に修正

// ① NULL 非許容型エラーの修正
// 旧: function get_name(string $name): string { return strtoupper($name); }
// 新: PHP8では null を渡すと Fatal error
function get_name(?string $name): string {
    return strtoupper($name ?? '');
}

// ② create_function() の廃止対応
// 旧: $fn = create_function('$x', 'return $x * 2;');
// 新: アロー関数を使用
$fn = fn($x) => $x * 2;

// ③ each() の廃止対応(PHP7.2で非推奨、PHP8で削除)
// 旧:
// while (list($key, $val) = each($array)) { ... }
// 新:
foreach ($array as $key => $val) {
    // 処理
}

// ④ str_contains / str_starts_with / str_ends_with(PHP8.0新機能)
// 後方互換性のためのPolyfill
if (!function_exists('str_contains')) {
    function str_contains(string $haystack, string $needle): bool {
        return $needle === '' || strpos($haystack, $needle) !== false;
    }
}
if (!function_exists('str_starts_with')) {
    function str_starts_with(string $haystack, string $needle): bool {
        return strncmp($haystack, $needle, strlen($needle)) === 0;
    }
}
if (!function_exists('str_ends_with')) {
    function str_ends_with(string $haystack, string $needle): bool {
        return $needle === '' || substr($haystack, -strlen($needle)) === $needle;
    }
}

ステップ4:プラグインのPHP8互換性問題を解決する

# PHP Compatibility Checkerプラグインで非互換コードを検出
wp plugin install php-compatibility-checker --activate
wp eval "
// PHPCompatibility::check_directory() の結果を確認
// 管理画面 → Tools → PHP Compatibility から実行
echo 'Run compatibility check from WP Admin > Tools > PHP Compatibility' . PHP_EOL;
"

# 問題のあるプラグインを無効化して原因を特定
wp eval "
\$active_plugins = get_option('active_plugins');
echo 'Active plugins: ' . count(\$active_plugins) . PHP_EOL;
foreach (\$active_plugins as \$plugin) {
    echo '  - ' . \$plugin . PHP_EOL;
}
"

# 二分探索でエラーを起こすプラグインを特定
wp plugin deactivate --all
wp plugin activate akismet  # 1つずつ有効化してエラーを確認

ステップ5:PHPバージョンのアップグレード手順

# 現在のPHPバージョン確認
php -v
wp eval "echo PHP_VERSION;"

# Ubuntu/Debianでのアップグレード
# sudo add-apt-repository ppa:ondrej/php
# sudo apt update
# sudo apt install php8.2 php8.2-mysql php8.2-gd php8.2-curl php8.2-xml php8.2-mbstring php8.2-zip
# sudo a2dismod php7.4 && sudo a2enmod php8.2
# sudo systemctl restart apache2

# cPanelでのPHPバージョン変更
# cPanel → PHP Selector / MultiPHP Manager からバージョンを変更

# バージョン変更後のWordPress動作確認
wp eval "
echo 'PHP: '     . PHP_VERSION . PHP_EOL;
echo 'WP Core: ' . \$GLOBALS['wp_version'] . PHP_EOL;

// 必須エクステンション確認
\$required = ['gd', 'curl', 'mbstring', 'xml', 'zip', 'mysqlnd'];
foreach (\$required as \$ext) {
    echo \$ext . ': ' . (extension_loaded(\$ext) ? 'ok' : 'MISSING') . PHP_EOL;
}
"

注意事項

  • PHPのメジャーバージョンアップ(7.4 → 8.0/8.1/8.2)は必ずステージング環境でテストしてから本番に適用してください。プラグインとテーマの互換性を事前に確認することが重要です
  • E_DEPRECATED警告を非表示にする(error_reporting = E_ALL & ~E_DEPRECATED)のは一時的な対処です。根本的にはプラグインやテーマを最新版に更新するか、PHP8対応版に置き換えてください
  • PHP8.0以降ではmatch式・名前付き引数・Union型など多くの新機能が使えます。古いコードを積極的に新しい構文に書き直すと長期的な保守性が向上します

まとめ

WordPressのPHPバージョンエラーの解決は①PHP_VERSION確認・プラグインのRequiresPHPフィールド確認・error_logでFatal errorとDeprecated警告を確認、②WP_DEBUG_LOG=true・WP_DEBUG_DISPLAY=falseでエラーをログに記録・.user.iniでmemory_limit=256M・error_reporting=E_ALL & ~E_DEPRECATED設定、③?stringのnull許容型・create_function廃止対応・each()をforeachに置換・str_contains/str_starts_withのPolyfillを追加、④PHP Compatibility Checkerで非互換コードを検出・プラグインを1つずつ有効化して問題箇所を二分探索・古いプラグインを更新または代替品に変更、⑤sudo a2enmod php8.2またはcPanel MultiPHPでバージョン変更・必須エクステンション(gd/curl/mbstring)の存在確認の手順で解決します。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲