会員登録(無料)
ログイン
スキルアップは今すぐこちら!▶

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

WordPress(ワードプレス)
この記事は約10分で読めます。

ワードプレスのテーマエディタから「ファイルを更新」を押したタイミングで、突然。

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

と、表示されてしまい、ファイルの更新が出来なくなってしまいました。

この警告は、Wordpressのコードチェック機能で、コードエラーが起きると更新できないような仕様になっているようです。

GASの本が出ました!

初めてのGAS「GoogleフォームとGASで自動返信メールを送る」編【2022年版】
【2022年版 Google Apps Scriptでフォームのメール自動送信を作成】 作業を自動化できるGoogle Apps Script(GAS)...

サーバのWAF(Web Application Firewall)をOFFにする?

サーバのWAF(Web Application Firewall)をOFFにすることで更新ができる場合があります。

WAF(Web Application Firewall)とは、ウェブアプリケーションの脆弱性を悪用した攻撃からウェブアプリケーションを保護するセキュリティ対策の一つ。

https://ja.wikipedia.org/wiki/Web_Application_Firewall

ダメでした。

WordPressアドレスをhttps://~にする

WordPressアドレス(URL)・サイトアドレス(URL)をSSL設定に変更してみます。

保存した途端にワードプレスの管理画面に入れなくなる可能性があるので、変更は慎重に行いましょう。もし復旧する自信が無ければ、変更しないほうが無難です。

ダメでした。

file.php

wp-admin内のincludes内の「file.php」を開きます。

517行目あたりの「if($is_active && ~~ )」のあたりからreturn new WP_Error( ~~ )あたりをコメントアウトしてみます。

if ( $is_active && 'php' === $extension ) {

		$scrape_key   = md5( rand() );
		$transient    = 'scrape_key_' . $scrape_key;
		$scrape_nonce = (string) rand();
		// It shouldn't take more than 60 seconds to make the two loopback requests.
		set_transient( $transient, $scrape_nonce, 60 );

		$cookies       = wp_unslash( $_COOKIE );
		$scrape_params = array(
			'wp_scrape_key'   => $scrape_key,
			'wp_scrape_nonce' => $scrape_nonce,
		);
		$headers       = array(
			'Cache-Control' => 'no-cache',
		);

		/** This filter is documented in wp-includes/class-wp-http-streams.php */
		$sslverify = apply_filters( 'https_local_ssl_verify', false );

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

		if ( function_exists( 'session_status' ) && PHP_SESSION_ACTIVE === session_status() ) {
			// Close any active session to prevent HTTP requests from timing out
			// when attempting to connect back to the site.
			session_write_close();
		}

		$url                    = add_query_arg( $scrape_params, $url );
		$r                      = wp_remote_get( $url, compact( 'cookies', 'headers', 'timeout', 'sslverify' ) );
		$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', 'sslverify' ) );
			$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 );
			wp_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 );
		}
	}

保存した途端にサイト全体が真っ白になるかエラーコードが表示される可能性があるので、変更は慎重に行いましょう。もし復旧する自信が無ければ、変更しないほうが無難です。

ファイルの編集に成功しました。

ファイルを更新を押すと、無事ファイルの編集に成功しました!

テーマエディターで無事に「ファイルを更新」をすることができました。

まとめ

wp-admin内のincludes内の「file.php」を修正することで、ひとまず回避できました。しかしワードプレス本体の更新が走ったらfile.phpは更新されて元に戻ってしまう問題がひとつと、phpファイルを更新するとサイトがダウン(コードエラー)して復旧不可になる可能性もあります

そもそも、テーマエディターでphpファイルを更新する方法自体がデンジャーオブデンジャーですので、自信が無い場合は、扱わないほうが無難な気がします。

エラーが発生するとブラウザ上からは修正・復旧不可になってしまいますので操作する際はFTP接続できる環境は必須です。

※全角スペースを誤って入れてしまい、にっちもさっちもいかなくなった状態です。

次の瞬間、もはや何もできなくなります。操作にはくれぐれも、ご注意ください。

ではまた😃

タイトルとURLをコピーしました