16
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-09-06

はじめに

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 テーマやプラグインが管理画面から更新できない場合の対処法

16
21
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?