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

吉永 2020年3月28日

WordPress4.9 または 5.0をお使いの方で、

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

といったエラーが出る場合があります。

この原因は、Wordpressの新たな機能のコードチェック機能が働くためだそうで、コードがエラーを起こしているときには更新ができなくなったようです。
多少の違いも見逃してくれないようで、今まで問題なく動いていたものが、アップデートで突然動かなくなってあたふたしてる人も多いと思います。
まったく余計なおせっかいをしてくれますね。

この場合、FTPかSSHでwp-admin/includes/file.phpの「492〜599行目」をコメントアウトすれば解決します。

 

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 );
//  }
// }

上です。
管理画面からいつも通り保存できるようになるはずです。

注意

このfile.phpはWordPressをバージョンアップで上書きされるので、バージョンアップするたび今回みたいにコメントアウトする必要があります。
めんどくせえな
また、ファイルをチェックする機能をコメントアウトしているわけなので、危険な内容の更新も反映されてしまいます。

無料イラスト名【WordPress】「致命的なエラーをチェックするためにサイトと通信できないため、PHP の変更は取り消されました。」というエラーが出て更新ができないとき
イラストのカテゴリwordpress構築
イラストのタグ