致命的なエラーをチェックするためにサイトと通信できないため、PHPの変更は取り消されました。

バージョン4.9のワードプレスでテーマファイルを編集すると「致命的なエラーをチェックするためにサイトと通信できないため、PHP の変更は取り消されました。SFTP を使うなど、他の手段で PHP ファイルの変更をアップロードする必要があります。」と表示されることがあります。

これはワードプレスのバージョン4.9から発生し出した現象で、新たに更新されたバージョン「4.9.1」「4.9.2」「4.9.3」「4.9.4」「4.9.5」でも改善されていません。

バージョン4.9.4でも改善されなかったため、業を煮やして真面目に調べた所、「/wp-admin/includes/file.php」の531行目の「admin_url( 'theme-editor.php' )」を「network_admin_url( 'theme-editor.php' )」に変更することでこのエラーは消えました。どうやらマルチサイトの場合は「admin_url」ではなく「network_admin_url」でないと「theme-editor.php」への内部的なパスが異なるのかも知れません。バージョン4.9から編集ファイルの更新に非同期通信の技術が採用されているようなので、恐らくそれに伴うファイルパスへの対応がうまくいっていないのでしょう。

ただし、Basic認証を使っている場合は上記の方法ではうまくいきません。こちらのケースでは551行目と570行目の「$result = $loopback_request_failure;」を「$result = true;」に変更して583行目の「if ( true !== $result ) {・・・}」条件分岐内へ強制的に処理が通らないようにします。その際、trueをクォートで囲まないようにします。囲むと動作しません。$loopback_request_failureは今回問題となるエラーメッセージ(原文は英語)などが格納された配列です。これが「if ( true !== $result ) {・・・}」の条件分岐内を通らないことで、586行目の「file_put_contents( $real_file, $previous_content );」が実行されなくなり、サイトとの通信不能によって、更新が前の状態に巻き戻されるのを防ぎます。ただ、やはりBasic認証を使っていない場合は、上記の通り「admin_url」を「network_admin_url」に変更した方がセキュリティー的にも安全と考えられます。

尚、下に記述した対策は発現当初のものですので、今後は上記のように「admin_url」を「network_admin_url」に変更したほうがセキュリティー的にも良いと思います。今回の原因がこの部分だとすると、今後のワードプレスのバージョンアップで改善されなくても簡単に対応できることと思います。

発生する条件

マルチサイトの場合、親サイトのテーマファイルを編集しようとしたら発現します。子サイトの場合、親サイトとは異なるテーマファイルを適用していて、そのテーマファイルを編集する場合は、このエラーが発現しません。また、親サイトのテーマファイルを変更すると、元のテーマファイルは編集できるようなって、今度は新たに変更した親サイトのテーマファイルが編集できなくなります。このことからワードプレスの仕様ではなく、バージョンアップによるバグと考えられます。尚、プラグインの編集画面ではこのような現象は発生しません。

この現象に関係していると思われるワードプレス本体のファイル

「/wp-admin/theme-editor.php」等です。

一時的な対処法

ワードプレス本体のファイルを弄ることは非推奨ですが、今回の場合は編集できないため、4.9より前の「theme-editor.php」で上書きアップロード(ダウングレード)してみました。現状ではこれで回避できますが、この問題が改善されない限りは、今後のワードプレスバージョンアップによってエラーが返される可能性も十分にあります。また、親サイトのテーマファイルを一時的に変更して、その間にもともと使っていたテーマファイルを編集するという方法も可能なようです。ただ、編集時に一々テーマ変更しなければならず、それ専用のテーマを用意しなければならないといった煩わしさがあります。それでもバージョン4.9から使えるようになったjavascriptのエラーを検出してくれる編集画面を使いたい場合は、後者のほうが良さそうです。