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

はじめに

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

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

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

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

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

FTPでええから早く更新させろ。という方はこちらの記事を参考にしてください。

 

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

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

// 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^)

Qiitaでみたい方はこちら