2026年5月19日

2026年5月19日

WordPressのPHPバージョンをアップグレードする方法

はじめに

WordPressのサイトをPHP 7.4からPHP 8.2にアップグレードしたいがプラグインの互換性が心配・PHPを更新したらサイトが壊れた・複数のWordPressサイトを異なるPHPバージョンで動かしたいといった問題の解決方法を解説します。

症状・原因

  • PHP 8.0以降で削除された関数(each()create_function()など)を使っているプラグインがある
  • Deprecated警告が大量に発生してログが埋め尽くされている
  • PHP-FPMのソケットパスが変更されNginxが接続できなくなっている
  • 複数PHPバージョンが混在してApache/Nginxがどのバージョンを使うか混乱している

解決手順

ステップ1:PHP互換性チェックを行う

# ✅ 現在のPHPバージョンを確認
php -v
# → PHP 7.4.33 (cli)

wp eval "echo PHP_VERSION;" --path=/var/www/html/
# → 7.4.33

# ✅ PHP Compatibility Checker プラグインで互換性確認
wp plugin install phpcompatibilitywp --activate --path=/var/www/html/
wp eval "
\$result = PHPCompatibilityWP::get_scan_results();
print_r(\$result);
" --path=/var/www/html/ 2>/dev/null

# ✅ WP-CLI の php-compat ツールでスキャン
wp cli check-update --path=/var/www/html/

# ✅ PHP_CodeSniffer + PHPCompatibility で全ファイルをスキャン
composer global require squizlabs/php_codesniffer dealerdirect/phpcodesniffer-composer-installer phpcompatibility/php-compatibility

phpcs --standard=PHPCompatibility \
      --runtime-set testVersion 8.2- \
      /var/www/html/wp-content/plugins/my-plugin/ 2>&1 | head -30
# → ERROR: Function each() is deprecated since PHP 7.2 and removed since PHP 8.0
# → FOUND 12 ERRORS AND 34 WARNINGS

# ✅ 非推奨関数の使用を一覧
grep -r "each\|create_function\|ereg\|split(" /var/www/html/wp-content/plugins/ | grep "\.php:" | head -20

ステップ2:PHP 8.2をインストールする

# ✅ PHP 8.2 をインストール(Ubuntu)
sudo apt install -y software-properties-common
sudo add-apt-repository -y ppa:ondrej/php
sudo apt update
sudo apt install -y php8.2 php8.2-fpm php8.2-mysql php8.2-xml \
    php8.2-curl php8.2-zip php8.2-gd php8.2-mbstring php8.2-intl \
    php8.2-imagick php8.2-redis

# ✅ PHP 8.2 のバージョン確認
php8.2 -v
# → PHP 8.2.x

# ✅ PHP-FPM 8.2 を起動
sudo systemctl enable php8.2-fpm
sudo systemctl start php8.2-fpm
sudo systemctl status php8.2-fpm
# → Active: active (running)

# ✅ PHP 8.2 FPM のソケットパスを確認
ls /run/php/
# → php7.4-fpm.sock  php8.2-fpm.sock ← 両方のバージョンが動作中

# ✅ wp-config.php で PHP バージョンを確認
php8.2 /usr/local/bin/wp eval "echo PHP_VERSION;" --path=/var/www/html/
# → 8.2.x ← PHP 8.2 で実行確認

ステップ3:NginxをPHP 8.2に切り替える

# ✅ Nginx の PHP-FPM ソケット設定を変更
sudo grep -n "fastcgi_pass" /etc/nginx/sites-available/wordpress.conf
# → 15: fastcgi_pass unix:/run/php/php7.4-fpm.sock;

sudo sed -i 's/php7.4-fpm.sock/php8.2-fpm.sock/g' \
    /etc/nginx/sites-available/wordpress.conf

# ✅ 設定を確認
grep "fastcgi_pass" /etc/nginx/sites-available/wordpress.conf
# → fastcgi_pass unix:/run/php/php8.2-fpm.sock;

# ✅ Nginx の設定をテスト・リロード
sudo nginx -t
# → nginx: configuration file /etc/nginx/nginx.conf test is successful

sudo nginx -s reload

# ✅ PHP バージョンが切り替わったか確認
curl -s https://example.com/phpinfo.php | grep "PHP Version" | head -1
# → PHP Version 8.2.x ← 切り替え成功

# ✅ Apache の場合
sudo a2dismod php7.4
sudo a2enmod php8.2
sudo apachectl graceful

# ✅ WordPress が PHP 8.2 で動作しているか確認
wp eval "echo PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION;" --path=/var/www/html/
# → 8.2

ステップ4:PHP 8.xの互換性問題を修正する

// ✅ PHP 8.0: 削除された関数の代替
// each() → foreach で代替
// PHP 7.x
reset($array);
while ([$key, $val] = each($array)) { /* ... */ }
// PHP 8.x
foreach ($array as $key => $val) { /* ... */ }

// ✅ PHP 8.0: 型の厳格化(TypeError)
// 文字列を数値として比較する挙動が変わった
// PHP 7.x: 0 == "foo" → true
// PHP 8.0: 0 == "foo" → false

// ✅ PHP 8.1: 非推奨: 関数の必須パラメータの後のオプションパラメータ
// BAD
function my_function($required, $optional = null, $also_required) {}
// GOOD
function my_function($required, $also_required, $optional = null) {}

// ✅ PHP 8.2: 動的プロパティの非推奨
class MyClass {
    // PHP 8.2+: 動的プロパティには #[AllowDynamicProperties] が必要
    public string $defined_property = '';
}
// 未定義プロパティへの代入は Deprecated
# ✅ PHP 8.2 の Deprecated 警告を確認
grep "Deprecated" /var/log/wordpress/debug.log | head -20
# → PHP Deprecated: Creation of dynamic property

# ✅ プラグインの PHP 8.2 対応を確認
wp plugin list --path=/var/www/html/ --format=csv | head -20
# → 互換性のないプラグインは開発者のサポートページを確認

ステップ5:問題が発生した場合のロールバック

# ✅ PHP 7.4 に切り戻す
sudo sed -i 's/php8.2-fpm.sock/php7.4-fpm.sock/g' \
    /etc/nginx/sites-available/wordpress.conf
sudo nginx -s reload

# ✅ PHP 7.4 と 8.2 を複数サイトで使い分ける
# サイトA(PHP 8.2)
cat /etc/nginx/sites-available/site-a.conf
# → fastcgi_pass unix:/run/php/php8.2-fpm.sock;

# サイトB(PHP 7.4 互換性のないプラグイン使用中)
cat /etc/nginx/sites-available/site-b.conf
# → fastcgi_pass unix:/run/php/php7.4-fpm.sock;

# ✅ PHP のデフォルトバージョンを切り替え(CLI)
sudo update-alternatives --set php /usr/bin/php8.2
php -v
# → PHP 8.2.x

# ✅ PHP 8.2 移行後の動作確認チェックリスト
wp core is-installed --path=/var/www/html/
wp plugin list --path=/var/www/html/ | grep -i inactive
wp eval "echo 'All OK: PHP ' . PHP_VERSION;" --path=/var/www/html/

# ✅ ページキャッシュをクリア(PHP変更後)
wp cache flush --path=/var/www/html/
wp transient delete --all --path=/var/www/html/

注意事項

  • PHPをアップグレードする前にステージング環境でテストしてください。本番環境でのアップグレードは必ずメンテナンスウィンドウを設けて行い、事前にデータベースとファイルのバックアップを取得してください
  • PHP 8.0以降ではstrict_types = 1が指定されたファイルへの型不一致の引数渡しがTypeErrorになります。プラグインのエラーログを確認してPHP 8.x対応版が存在するか確認してください

まとめ

PHPバージョンアップグレードの手順は①PHP Compatibility Checkerプラグインとphpcs --standard=PHPCompatibilityでプラグイン・テーマの互換性を事前確認、②add-apt-repository ppa:ondrej/phpでPHP 8.2をインストール・php8.2-fpmを起動・ソケットパスを確認、③Nginxのfastcgi_passソケットパスをphp7.4-fpm.sockphp8.2-fpm.sockに変更・nginx -tでテスト・リロード、④PHP 8.0削除関数(each()等)の代替実装・型の厳格化対応・PHP 8.2動的プロパティの対応、⑤問題発生時はソケットパスを7.4に戻してロールバック・複数バージョンを並行稼働してサイト別に切り替えの手順で移行します。

お気軽にご相談ください

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