📚

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を指定します。

docker-compose.yml
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