Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
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 テーマやプラグインが管理画面から更新できない場合の対処法

ayies128
株式会社illustrious CTO。 EC業務を色々な角度から効率化できるように日々システム開発を行っています。 システム開発の話から飲みに行こうって話までなんでもどうぞ。 うどんとお酒と #UVERWorld が大好きです。 世界で売るためのECインフラサービス「lismoa」の開発運営を行なっています。 https://lismoa.com/
http://nabesys.com/
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