【WordPress】管理画面でphpファイルを更新する方法

スポンサーリンク

WordPressのアップデートで管理画面からphpファイルの更新ができない場合があります。
毎回FTPでダウンロード&アップロードが面倒くさい人用に管理画面で出来るようにする方法を紹介。

サイトを1個しか持っていない人は外観→テーマの編集
マルチサイト化している場合は参加サイト→サイトネットワーク管理→テーマ→テーマエディタで辿り着く。

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

前も出たな。何の作業か忘れたけど。
その時はご指示の通りFFFTPで済ませたけど、今後も何かしらでイジると思ったので管理画面で更新できるように根本的に解決した。

そのためにはまたFFFTPでやらなきゃいけないんだけどね。
file.phpをFFFTPでダウンロードして書き換えてまたFFFTPでアップロードして更新する
これを一度行えばあとは管理画面で更新ができるようになります。
まずfile.phpの在り処としてはpublic_html/wp-admin/includes/の中にあります。

file.phpを何でも良いのでテキストエディタで開きます。メモ帳で開きました。
何もイジっていなければ500行目ちょっと前に該当のコード(管理画面で更新させない命令文)があります。
それを/*から*/で括ってでコメントアウトすればOK。

/*
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が更新されたらコメントアウトの箇所が削除されるので再度/*から*/で括る必要があります。

コメント