PHP 5.6で運用していたWordPressを段階的にアップデートしたメモ
はじめに
共用サーバーではPHPやデータベースのバージョンなどを全体の設定に合わせることになります。運用していたWordPressが動作しなくなったという相談があり、対応しました。
現在のサーバーはPHP 8.4で、PHPのバージョンアップのどこかのタイミングで動作しなくなったのだろうと考えました。
PHPのバージョンを下げて動作するポイントまで戻る
DockerでPHPのバージョンを7.4、7.2と下げていきましたが、500番エラーが発生して原因がよくわかりませんでした。PHP 5.6でDB接続エラーになったので、まずはPHP 5.6で動かしてみることにしました。
PHP 5.6だとMySQL 8.0に接続できないので、MySQL 5.7を利用します。MySQL 5.7はApple Siliconのためのビルドがないので、platform: linux/amd64
を指定します。
services:
wordpress:
image: wordpress:php5.6-apache
container_name: <PROJECT>_wordpress
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_NAME: <DB_NAME>
WORDPRESS_DB_USER: <DB_USER>
WORDPRESS_DB_PASSWORD: <DB_PASSWORD>
volumes:
- ./wordpress:/var/www/html
depends_on:
- db
db:
image: mysql:5.7
platform: linux/amd64
container_name: <PROJECT>_mysql
environment:
MYSQL_ROOT_PASSWORD: <DB_ROOT_PASSWORD>
MYSQL_DATABASE: <DB_NAME>
MYSQL_USER: <DB_USER>
MYSQL_PASSWORD: <DB_PASSWORD>
volumes:
- ./data:/var/lib/mysql
開発環境のMySQLをリストア
以下のようにMySQLのデータベースをリストアします。
docker exec -i <IMAGE_NAME> mysql -u <DB_USER> -p<DB_PASSWORD> <DB_NAME> < <BACKUP_FILE>.sql
WordPressのユーザーのパスワードがわからないので設定します。まずはデータベースのインタラクティブシェルにログインします。
docker-compose exec db mysql -u root -p
MD5でパスワードをハッシュ化して設定します。テーブル名はプレフィックスに応じて変更してください。
use <DB_NAME>;
UPDATE wp_users SET user_pass = MD5('<NEW_PASSWORD>') WHERE user_login = '<USER_NAME>';
バージョンアップ
WordPressにログインして、利用しているプラグインを確認します。動作に影響しない範囲で、メンテナンスされていないプラグインを削除します。WordPressの状況によっては、この部分の作業が大変になるかもしれません。
PHP 5.6の段階でWordPressは6.2まで動くようなので、まずは6.2にアップデートします。
アップデートできたら今度はPHP 7.2にして、最新のWordPress 6.8.3までアップデートします。
最後にPHP 8.4とMySQL 8.0にして、無事に起動できるか確認します。
運用環境のWordPressに反映
開発環境のWordPressのファイルを運用環境に反映させます。wp-config.php
は運用環境に合わせて編集します。
運用環境のMySQLをリストア
WordPressにAll-in-One WP Migrationをインストールして、データをエクスポートします。
以下のコマンドで展開して、データベースのバックアップファイルを利用します。
npx wpress-extract filename.wpress
このバックアップファイルで運用環境のMySQLをリストアしようとすると、以下のような部分でエラーになります。
`comment_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
これは'0000-00-00 00:00:00'
の指定がMySQL 8.0でエラーとなってしまうようです。私の場合は'0000-00-00 00:00:00'
をCURRENT_TIMESTAMP
に置換して対応しました。
おわりに
ここまでの作業でWordPressの最新版をサーバーで動作させることができました。WordPressのバージョンアップはプラグインの状況次第で難易度が左右されそうです。今回はプラグインが比較的シンプルでよかったです。
Discussion