WordPress修改functions报错:未能与站点联系来检查致命错误

Mrzhou
Mrzhou
Mrzhou
259
文章
1
评论
2020年6月28日12:57:53 评论 2,151

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

就这个问题我也是百度谷歌找了好久,有人说这是官方的BUG,也有人说是因为PHP版本不兼容,各种说法都有,这个错误提示其实是WordPress 4.9版本之后添加的功能,检查WP文件编辑器中是否有PHP错误,以防止网站因修改模板文件而崩溃。

WordPress修改functions报错:未能与站点联系来检查致命错误

解决方法

如果不准备通过其它方式修改模板文件,也可以通过修改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 );
		}
	}

然后替换原来文件,即可解决,删除后不会对其它功能造成影响。经本人测试,删除以上检测代码后,后台更新修改模板函数文件成功。

注意:

据网友反馈,如下插件也会造成后台无法更新修改functions.php

  • 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

继续阅读
历史上的今天
六月
28
Mrzhou
  • 本文由 发表于 2020年6月28日12:57:53
  • 转载请务必保留本文链接:https://zhouxiaosong.com/2156.html
如何防止和应对WordPress的DDoS攻击 网络运维

如何防止和应对WordPress的DDoS攻击

WordPress是世界上最受欢迎的建站程序之一,因为它具有强大的功能和安全的代码库。但是,这不能保护WordPress或任何其他软件免受Internet上常见的恶意DDoS攻击。 DDoS攻击会使网...
WordPress禁用右键/F12插件分享(2020) 资源分享

WordPress禁用右键/F12插件分享(2020)

如果你希望你的网站禁止复制文章内容文字、禁用右键和F12功能,可以选择性使用以下几个WordPress插件可以有效防止内容被盗用,每个插件都有不一样的功能,可能部分功能有付费,不过暂不影响使用。 WP...
WordPress数据库连接错误有效解决方案 网站建设

WordPress数据库连接错误有效解决方案

前段时间我另外一个WordPress博客莫名频繁出现“建立数据库连接时出错”之后各种找原因,终于完美得到解决,分享给大家希望有所帮助。   一、检查数据库连接信息 这个是最基础的,如果是博客...
匿名

发表评论

匿名网友 填写信息

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