WordPress 4.7.5 から 4.8 へのバージョンアップに失敗してから解決するまで

WordPress

このブログの WordPress での出来事。最新版の通知が来ていたのでバージョンアップを試みたところ失敗してしまった。失敗の状況、調査、原因、解決方法についてまとめる。

1度目のバージョンアップ失敗

コアのバージョンアップは管理画面から行った。ボタンをポチッと押す。すると以下のような文章を吐き出し終了した。

WordPress を更新
https://downloads.wordpress.org/release/ja/wordpress-4.8.zip から更新をダウンロードしています…

更新を展開しています…

展開したファイルをチェックしています…

最新版をインストールする準備をしています…

メンテナンスモードを有効にします…

必要なファイルをコピーしています…

メンテナンスモードを無効にします…

ファイルをコピーできませんでした。: wp-admin/includes/class-wp-community-events.php

インストール失敗

これはよく遭遇する失敗で、おそらくパーミッションに問題がありファイル操作が行えなかったのだろう。

パーミッションを最適化

コピーに失敗したファイル class-wp-community-events.php は WP 4.8 で追加になった機能/ファイルのよう。4.8 ではダッシュボードに近隣の WordPress イベントが表示されるようになったが、そのためのファイルだと名前から推測。

上書きでなく新規作成が必要だったためにこのファイルだけ失敗したのだろうか。ひとまず /wp/wp-admin/includes/ のパーミッションを変更した。

2度目のバージョンアップ失敗

管理画面に戻り、再びボタンをポチッとする。まだ問題があったとしても、少なくとも前回と同じところまでは進むだろうと予想。しかし残念、それは外れた。画像のように、タイトルだけ表示されそれっきりとなってしまった。

何も手がかりがない!!

ブラウザの開発ツールを開けみると、まるで HTML がつくられていない。 ajax でもつかっているのかな、そこで止まっているのかな、と考えるも console パネルには何のログもない。困った。

  • 何度か更新を再挑戦 → ダメ
  • ブラウザのシークレットモードで再挑戦 → ダメ
  • しばらく時間をおいてから再挑戦 → ダメ

手軽なアイディアから試すも結果は同様。もう少ししっかりとした解決作を考えねばならぬようだ。

WP_DEBUG を true にしてスタックトレース

エラーメッセージなどは出力されていないが、画面がめちゃくちゃに壊れているわけでもないので、プログラム的には正常に動作しているように感じた。ならばまずは実際のプログラムの流れを確認しよう。

wp-config.php を編集しデバッグモードを on へ変更した。

define( 'WP_DEBUG', true );

この状態で再度更新を行うと、スタックトレースが得られた。

Fatal error: Uncaught Error: Call to undefined function wp_doing_cron() in /wp/wp-admin/includes/update.php:110
Stack trace:
#0 /wp/wp-admin/includes/class-core-upgrader.php(350): get_core_checksums('4.7.5', 'ja')
#1 /wp/wp-admin/includes/class-core-upgrader.php(95): Core_Upgrader->check_files()
#2 /wp/wp-admin/update-core.php(489): Core_Upgrader->upgrade(Object(stdClass), Array)
#3 /wp/wp-admin/update-core.php(654): do_core_upgrade(false)
#4 {main} thrown in /wp/wp-admin/includes/update.php on line 110

定義されていない関数 wp_doing_cron() を呼び出していることがバージョンアップ失敗の直接の原因だとわかった。

おや?もしかしてかなり深刻なご様子?

続けて問題の wp_doing_cron() について調べる。これは 4.8 で追加された関数とわかった。

もしかして 4.7.5 と 4.8 が混在している? しかも運の悪く、バージョンアップに必要な機能が抜け落ちている?

WP 4.7.5 へ手動バージョンダウン

うーん。どうしたものか。

悩んだ末、一旦元のバージョンに戻すことにした。

  1. 以前のバージョンのソースコードをダウンロード
  2. /wp/wp-admin//wp/wp-includes/ を削除
  3. 以前の /wp/wp-admin//wp/wp-includes/ を配置
  4. 管理画面へアクセス!

この作業はすんなり成功。パーミッションも初期インストール時の設定と同様にした。

パーミッションを最適化

手動バージョンダウンを行い以前の状態に戻したらば、/wp/wp-admin/includes/ のパーミッション変更。

そしていざ更新!

WP 4.8 へアップデート

成功!

すべての作業が完了し、無事最新版の状態となることができた。

まとめ

元をたどればパーミッションの設定不備という簡単な問題だったが、意外にも問題が大きくなってしまった。

原因
パーミッションの不備

解決策
パーミッションの最適化

作業手順

  1. WordPress のデバッグモードを on
  2. 原因特定
  3. コアファイルの手動バージョンダウン
  4. パーミッションの最適化
  5. 再度バージョンアップを実行