WordPress「致命的なエラーをチェックするためにサイトと通信できないため~」更新エラーの対処法

WordPressでテーマファイルを編集した際に「致命的なエラーをチェックするためにサイトと通信ができないため、phpの変更は取り消されました。sftpを使うなど、他の手段でphpファイルの変更をアップロードする必要があります。」と表示され、更新が出来なくなってしまい、困ってしまった方も多いと思います。
ここでは、このエラー原因や対処方法について、解説していきます。
対処方法さえわかっていれば、エラーが発生しても慌てなくて済みますので、最後までお付き合いください。

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

致命的なエラーをチェックするためにサイトと通信できないため、php の変更は取り消されました。sftp を使うなど、他の手段で php ファイルの変更をアップロードする必要があります。
WordPressで表示される「致命的なエラーをチェックするためにサイトと通信できないため、 php の変更は取り消されました。sftp を使うなど、他の手段で php ファイルの変更をアップロードする必要があります。」とは、テーマやプラグインを更新した際に表示されるエラーメッセージです。
このメッセージが表示される原因は、WordPress4.9より実装された構文エラーを事前に防ぐ機能にあります。

構文エラーのチェック機能は、本来であれば歓迎すべき機能なのですが、WordPressの構文エラーチェック機能は、多少の間違いでさえもエラーとみなしてしまうため、このメッセージが表示されます。

sftpとは

sftpとは、SSH File transfer Protocol:SSHファイル転送プロトコル、あるいはSecure File Transfer Protocol:セキュアファイル転送プロトコルのことを指します。SSHを備えた別のプロトコルで、FTPと同様の動作を行いますが、安全な接続を行うことができます。Wordpressは、このsftpを使用して接続することも出来ます。

functions.php エラー

functions.phpエラーとは、functions.phpを更新した際に構文などに間違いがあった場合のエラーのことを指します。
functions.phpを更新した際にも、同様のエラーチェックが行われるようで、「致命的なエラーをチェックする~」のエラーが発生する場合もあるようです。

WordPressで「致命的なエラーをチェックするためにサイトと通信できないため」の影響

WordPressで「致命的なエラーチェックするためにサイトと通信できないため~」のメッセージが表示された場合、下記のような影響があります。

・管理画面からテーマ更新ができない。
・管理画面からプラグインの更新ができない。

また、テーマやプラグインの他にもfunctions.php を更新した際にも同様のエラーが発生し、更新することができなくなることもあるようです。

WordPressで「致命的なエラーをチェックするためにサイトと通信できないため」の対処法

WordPressで「致命的なエラーをチェックするためにサイトと通信できないため」の対処法について、ご説明します。

WordPressの管理画面に関するファイルを格納しているフォルダ内にあるfile.phpを編集することで、エラーチェックを無効化することができます。
FTP又は、SSHを使用し「wp-admin¥includes¥file.php」を開き、「492~599行目」をコメントアウトします。
コメントアウトしたコードは、WordPress4.9で実装された構文チェック機能の記述部分のため、構文チェック機能が実装される前の状態に戻ります。
構文チェック機能が有効であったため、少しの間違いでもエラーとなってしまい更新ができなかった状態から、構文チェック機能実装前に戻すことでエラー発生を回避することができます。
構文チェック機能が無効化されますので、間違った構文のまま更新してしまう可能性がありますので、更新する際は間違いがないか確認してから更新するようにしましょう。

作業前には必ずバックアップを取り、間違った場合には戻せるようにしておきましょう。また、作業を行い不具合が生じた場合は、自己責任となりますのでご注意ください。

実際の記述文は下記のようになっています。

/*ここからコメントアウト
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 );
}
}
ここまでコメントアウト */

まとめ

WordPressの4.9以降に実装された構文エラーチェック機能により、WordPressが使いにくくなったという意見が多いようです。
この構文エラーチェック機能は、現在のところ改善されていないようなので、更新ができないような状況になったら、一度コメントアウトを試してみてください。