未能与站点联系来检查致命错误,因此PHP修改已被回滚。您需要采用其他方式(如SFTP)上传您修改的PHP文件

知更鸟
知更鸟
知更鸟
1619
文章
6927
评论
2020年6月11日12:16:21 1 827

如果在WordPress后台主题编辑中修改模板php文件,点击更新文件时提示“未能与站点联系来检查致命错误,因此PHP修改已被回滚。您需要采用其他方式(如SFTP)上传您修改的PHP文件”。

这个错误提示是 WordPress 4.9 之后添加的功能,检查 WP 文件编辑器中是否有PHP错误,以防止网站因修改模板文件而崩溃。

未能与站点联系来检查致命错误,因此PHP修改已被回滚。您需要采用其他方式(如SFTP)上传您修改的PHP文件

有人说是WP的BUG,也有人说和服务器主机环境配置有关,也有人说是主题中有不规范的代码或者是某些插件会影响编辑模板,众说不一,不管了。

如果不准备通过FTP替换修改模板文件,可以通过修改WordPress程序文件,删除这个代码检查功能。

以WP5.4为例,打开wp-admin/includes/file.php程序文件,删除505-616行的如下代码:

展开

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

		$scrape_key   = md5( rand() );
		$transient    = 'scrape_key_' . $scrape_key;
		$scrape_nonce = strval( 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();
		}
		$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' ) );
			$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 );
		}
	}

然后替换原来文件,即可解决,删除后不会对其它功能造成影响。

经测试,删除上述检测代码后,后台更新修改模板文件秒过。

 

另外,据报告有如下插件会造成无法后台更新修改文件:
  • Magic Fields
  • WP Spamshield
  • GeoDirectory
  • Social Login WordPress Plugin – AccessPress Social Login Lite
  • Ninja Popups for WordPress
  • Custom firewalls or security rules
  • Some custom themes
  • ShortPixel Optimizer
  • WP Server Stats
weinxin
版权声明
本站原创文章转载请注明文章出处
解决WordPress 5.6 WordPress

解决WordPress 5.6 “从URL插入”图片BUG

在WordPress 5.6 唯一让人欣慰的是中文版同期发布,因为开发者一直在努力优化增强区块编辑器,而我自己一直在使用经典编辑器,没感觉有什么变化。 不过很快发现一个BUG,就是使用经典编辑器添加图...
WordPress 判断浏览器 WordPress

WordPress 判断浏览器

目前大部分主题模板对已淘汰的IE支持不好,影响体验,可以利用WordPress提供的变量,判断访问者用浏览器,然后提醒用户升级浏览器。 比如在主题模板适当位置添加: <?php global $...
WordPress 5.6 发布 WordPress

WordPress 5.6 发布

WordPress 5.6 为您带来无数方法,让您的想法自由自在,并把它们付给生活。使用全新的默认主题作为画布,它支持不断增长的块集合作为画笔。用文字画。图片。声音。或丰富的嵌入式媒体。 更大的布局灵...
搭建本地PHP8环境 WordPress

搭建本地PHP8环境

之前一直用phpStudy搭建本地环境,PHP8 于2020年11月26日发布,phpStudy目前并没有集成PHP8,试着添加无果,最后还是用回老牌的建站集成软件包XAMPP(Apache+MySQ...
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

评论:1   其中:访客  1   博主  0
    • badponycn badponycn 0

      为什么找不到file.php