WordPressテーマエディターからエラーで更新できない場合の手順

ブログ開設

こんにちは、きりです。
WordPressでテーマエディターから直接コードを追加・変更させようと更新ボタンを押すとこんなエラーが出てきませんか?

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

エ、エラー!? 取り消し!?
コードを追加しただけで、いきなりこんな文章が出てびっくりしますよね。
(私も驚きました。)

でも、大丈夫!
自分が何か変な事をした訳ではありません!(断言)

このエラーの理由とコードを変更する方法をお教えします。

目次

スポンサードサーチ

テーマエディターからエラーで更新できない場合の手順

WordPressテーマエディターからエラーで更新できない場合の説明2
結論から言うと、
これはWordPressのファイルチェック機能が働いているから出てくるものです。

なぜ更新が出来ないの?

改めてエラー内容を確認するとこうです。

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

この表示について調べると、こう言う事でした。

・ 危険なコードを入れると危ないからファイルチェックしました。
・ テーマエディターから『直接』コードを変更させません。
・ 別の手段で変更して下さい。

全然、エラーじゃなかった。

こちらはWordPress側の安全対策で、使用者が間違えたコードを入れてレイアウト崩れやシステムが動かないという事態を防ぐ為に入れているファイルチェック機能が働いただけでした。

運用の立場から見るとコードの保護を優先している事になるので正しい判断です。
(使う側からみれば、エラー表示はびっくりしますが。(汗))

【余談】
私の場合、このエラー表示が出る様になったのはWordPressのアップデートをしてからでした。

恐らくこのアップデートでファイルチェック機能が追加されたものと思われます。

アップデート前は何もなく直接コードの変更が出来ていたので、この表示が出た時は「また何かやらかしたか自分!?」と思いました。

解決策

WordPress初心者「じゃあ、どうやってコードを変更すればいいの?」

はい!簡単な方法があります。
『直接』が無理なら、別の方法で変更すれば大丈夫です。

それがFTPソフトを使った変更です。

変更したいファイルデータをFTPソフトでダウンロード、コードを修正してアップロードすれば完了です。

もう一つ別の方法もありますがWordPress初心者のうちはお勧めしません。
その理由も下に書いています。

それでは手順をご説明しましょう。

FTPソフトで簡単にコード変更する手順

手順

  1. FTPソフトを立ち上げる
  2. 該当ファイルデータをダウンロード
  3. ファイルデータのコードを変更
  4. 修正ファイルを元の場所に上書きアップロード

(1) FTPソフトを立ち上げる

まずはFTPソフトを立ち上げましょう。
もし、FTPソフトを使った事がない場合、こちらのページを参考に入れて下さい。
» 【ブログ初心者】WordPressでFTPソフトFileZillaの設定をしてみよう

※レンタルサーバーのFTP機能を使っても大丈夫ですが、サーバーダウン時など緊急時にFTPソフトは使える方が良いですよ。

(2) 該当ファイルデータをダウンロード

FTPソフトから、変更するファイルデータを探します。
このテーマエディターで変更するファイルデータは、テーマによって入っているフォルダ名が異なります。
『wp-content/themes』内から使用中のテーマ名のフォルダがあるので、その中からお探し下さい。

注意!コピーしたデータを使いましょう。

ダウンロードしたデータを直接変更せずに、コピーしたデータで内容を変更しましょう。
変更したデータをアップロードした後でWordPressが動かない、レイアウトが崩れたなどの問題が起きた場合、元データがあればそれを上書きアップロードする事で元に戻せます。
コピーしたデータと間違わない様に、元のデータは別フォルダを作ってその中に入れる、データ名の前に別の名前を付けるなど区別しておきましょう。
WordPressテーマエディターからエラーで更新できない場合の説明1

(3) ファイルデータのコードを変更

テキストエディターでファイルデータを開き、変更箇所を修正しましょう。

  • Macの場合
  • 「テキストエディット」で変更・保存が出来ます。

  • Windowsの場合
  • 「メモ帳」で開くと保存の際に不要なコードが自動で入る場合があります。コード変更が出来るテキストエディタにて変更・保存をしましょう。

(4) 修正ファイルを元の場所に上書きアップロード

変更したファイルデータをFTPソフトで元にあった場所へ上書きアップロード。
アップロード後は変更した部分がちゃんと出来ているか、またWordPressがちゃんと動くかを確認しましょう。
ちゃんと出来て入れば、これで完了です。

別の方法(自己責任)

もう一つの方法ですが、こちらはエラーチェック機能自体を止めてしまう方法になります。

この場合、致命的なエラーコードを入れてしまったらWordPressが動かない等の問題が発生します。
バックアップデータがあれば復旧出来ますが、復旧方法がわからない場合は試さないで下さい。

この方法をする場合はバックアップを必ず取り、自己責任でお願いいたします。

【これができる人】
・ 全て自己責任でWordPressを管理・運用できる
・ バックアップデータを必ず取る
・ 問題が起きた時でもバックアップを使って復旧できる

【メリット】
・ テーマエディターから直接コード変更が出来るようになる。

【デメリット】
・ 致命的なコードを入れた場合、WordPressが動かなくなる。
・ その状態からバックアップデータを使用して復旧作業が必要になる。
・ 今後、WordPressのバージョンアップデートがあるとエラーチェック機能が復活する事もある。

【エラーチェック機能自体を止める手順】
エラーチェック機能のコード部分をコメントアウトして機能させないようにします。
こちらもFTPソフトを使用します。

手順

  1. FTPソフトで対象フォルダに入る。
  2. 対象データファイルをダウンロード
  3. データファイルを修正
  4. 修正データフォルを上書きアップロード

(1)〜(2)までは上記のFTPソフトの手順と同じです。

(3)データファイルを修正
『wp-admin/includes/file.php』の該当箇所をコメントアウトします。
(PHPのコメントアウトは/*、*/で囲む、もしくは1行ずつ//を付けます。)
492〜599行目をコメントアウトします。下のコードは//でコメントアウトしたものです。

改めて注意

ファイルチェック機能を止めるので、今後、危険なエラーコードも反映されてしまいます。
必ず定期的にバックアップを取って下さい。


   // if ( $is_active && 'php' === $extension ) {

    //  $scrape_key = md5( rand() );
    //  $transient = 'scrape_key_' . $scrape_key;
    //  $scrape_nonce = strval( rand() );
    //  set_transient( $transient, $scrape_nonce, 60 ); // It shouldn't take more than 60 seconds to make the two loopback requests.

    //  $cookies = wp_unslash( $_COOKIE );
    //  $scrape_params = array(
    //      'wp_scrape_key' => $scrape_key,
    //      'wp_scrape_nonce' => $scrape_nonce,
    //  );
    //  $headers = array(
    //      'Cache-Control' => 'no-cache',
    //  );

    //  // Include Basic auth in loopback requests.
    //  if ( isset( $_SERVER['PHP_AUTH_USER'] ) && isset( $_SERVER['PHP_AUTH_PW'] ) ) {
    //      $headers['Authorization'] = 'Basic ' . base64_encode( wp_unslash( $_SERVER['PHP_AUTH_USER'] ) . ':' . wp_unslash( $_SERVER['PHP_AUTH_PW'] ) );
    //  }

    //  // Make sure PHP process doesn't die before loopback requests complete.
    //  @set_time_limit( 300 );

    //  // Time to wait for loopback requests to finish.
    //  $timeout = 100;

    //  $needle_start = "###### wp_scraping_result_start:$scrape_key ######";
    //  $needle_end = "###### wp_scraping_result_end:$scrape_key ######";

    //  // Attempt loopback request to editor to see if user just whitescreened themselves.
    //  if ( $plugin ) {
    //      $url = add_query_arg( compact( 'plugin', 'file' ), admin_url( 'plugin-editor.php' ) );
    //  } elseif ( isset( $stylesheet ) ) {
    //      $url = add_query_arg(
    //          array(
    //              'theme' => $stylesheet,
    //              'file' => $file,
    //          ),
    //          admin_url( 'theme-editor.php' )
    //      );
    //  } else {
    //      $url = admin_url();
    //  }
    //  $url = add_query_arg( $scrape_params, $url );
    //  $r = wp_remote_get( $url, compact( 'cookies', 'headers', 'timeout' ) );
    //  $body = wp_remote_retrieve_body( $r );
    //  $scrape_result_position = strpos( $body, $needle_start );

    //  $loopback_request_failure = array(
    //      'code' => 'loopback_request_failed',
    //      'message' => __( 'Unable to communicate back with site to check for fatal errors, so the PHP change was reverted. You will need to upload your PHP file change by some other means, such as by using SFTP.' ),
    //  );
    //  $json_parse_failure = array(
    //      'code' => 'json_parse_error',
    //  );

    //  $result = null;
    //  if ( false === $scrape_result_position ) {
    //      $result = $loopback_request_failure;
    //  } else {
    //      $error_output = substr( $body, $scrape_result_position + strlen( $needle_start ) );
    //      $error_output = substr( $error_output, 0, strpos( $error_output, $needle_end ) );
    //      $result = json_decode( trim( $error_output ), true );
    //      if ( empty( $result ) ) {
    //          $result = $json_parse_failure;
    //      }
    //  }

    //  // Try making request to homepage as well to see if visitors have been whitescreened.
    //  if ( true === $result ) {
    //      $url = home_url( '/' );
    //      $url = add_query_arg( $scrape_params, $url );
    //      $r = wp_remote_get( $url, compact( 'cookies', 'headers', 'timeout' ) );
    //      $body = wp_remote_retrieve_body( $r );
    //      $scrape_result_position = strpos( $body, $needle_start );

    //      if ( false === $scrape_result_position ) {
    //          $result = $loopback_request_failure;
    //      } else {
    //          $error_output = substr( $body, $scrape_result_position + strlen( $needle_start ) );
    //          $error_output = substr( $error_output, 0, strpos( $error_output, $needle_end ) );
    //          $result = json_decode( trim( $error_output ), true );
    //          if ( empty( $result ) ) {
    //              $result = $json_parse_failure;
    //          }
    //      }
    //  }

    //  delete_transient( $transient );

    //  if ( true !== $result ) {

    //      // Roll-back file change.
    //      file_put_contents( $real_file, $previous_content );
    //      if ( function_exists( 'opcache_invalidate' ) ) {
    //          opcache_invalidate( $real_file, true );
    //      }

    //      if ( ! isset( $result['message'] ) ) {
    //          $message = __( 'Something went wrong.' );
    //      } else {
    //          $message = $result['message'];
    //          unset( $result['message'] );
    //      }
    //      return new WP_Error( 'php_error', $message, $result );
    //  }
    // }
【余談】
このPHPのコメントアウトについて、それぞれ利点と難点があります。

『/*、*/』で囲む場合
・ 手間は楽。
・ 今回みたいな行数があると何処が終了か判りにくい。

『1行ずつ//』を付ける場合、
・ 結構な手間。
・ 何処まで終了か判りやすい。

一つのファイルデータ内で併用できるので、一行の注釈コメントなどが『/*、*/』で囲まれ、行数のあるコードは『//』でコメントアウトされる場合が多いです。

まとめ

FTPソフトを使って一手間かかりますが、これでコードの変更が出来ます。

今回のエラー表示は、WordPress側が危険なコードを直接入れない為にしているファイルチェック機能です。
致命的なエラーコードでも問題ないコードでも、この表示は出てきます。自分の入れたコードでエラーが出ている訳ではありませんので、安心して下さい。

ただ、どちらの方法をとっても必ずバックアップを取ってから試しましょう。