Help us understand the problem. What is going on with this article?

WordPress テーマやプラグインが管理画面から更新できない場合の対処法

More than 1 year has passed since last update.

はじめに

WordPressのバージョンを4.9にアップした皆さま。
いつものように管理画面でテーマやプラグインを更新しようとするとこんなエラーが出た経験はありませんか?

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

このエラーは新バージョンから実装されたファイルのエラーチェックで、
「ページがバグったら困るやろ?気軽に更新させへんで!」というものです。

このチェックが厳密なのかバグってるのかどうなのかわかりませんが、デフォルトで入っているファイルなどもことごとく更新できません。
なので皆さん対策を調べた挙句FTPでアップするという一手間が増えているのではないでしょうか?

今回は「FTPめんどい!!」という人のためにこのファイルエラーチェックを回避する方法を紹介します。

FTPでええから早く更新させろ。という方はこちらの記事を参考にしてください。
【対処法】WordPress4.9でテーマの編集がエラーでできない時

該当箇所をコメントアウトする

FTPかSSHでwp-admin/includes/file.phpの該当箇所をコメントアウトします。
492〜599行目をコメントアウトします。(PHPのコメントアウトは/**/で囲むか1行ずつ//

file.php
    // 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をバージョンアップで上書きされるので、バージョンアップするたび今回みたいにコメントアウトする必要があります。
めんどくせえな
また、ファイルをチェックする機能をコメントアウトしているわけなので、危険な内容の更新も反映されてしまいます。
今までと同じだからあまり気にしなくていいと思う。

終わりに

バージョン上がったらここら辺いい感じになるといいですね(^q^)

ブログでみたい方はこちら
WordPress テーマやプラグインが管理画面から更新できない場合の対処法

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした