现在的位置:首页>wordpress>正文

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

2020年07月26日 ⁄ 共 5789字 暂无评论

早在前几天,福利老幺的网站进行了一下更新,想不到很多意想不到的情况就出现了,应该最厉害的,就是升级自己的wordpress到5.4这个版本后,各种问题,其中有一个是修改代码时提示:未能与站点联系来检查致命错误,因此PHP修改已被回滚。您需要采用其他方式(如SFTP)上传您修改的PHP文件。如果只能靠上传服务器来修改一些简单的问题,那么以后要修改一些小问题,就相对要麻烦多了,于是百度了一下,找到了一些解决方法,这里分享一下.

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

官方对于这种错误提示,有自己的说法,那就是:这个错误提示是 WordPress 4.9 之后添加的功能,检查 WP 文件编辑器中是否有PHP错误,以防止网站因修改模板文件而崩溃。

解决方案1:可操作指数:✭ ✭

在出现前,为了测试WP Fastest Cache与WP Super Cache的区别,我停用了之前使用的WP Super Cache并安装启用WP Fastest Cache。后卸载了WP Fastest Cache并重新启用了WP Super Cache。这时编辑文件时出现该错误。 禁用WP Super Cache重新启用即可修复该问题。可能由于插件兼容性或者两个缓存插件冲突导致。

禁用 WP Super Cache 并重新启用一般能解决"未能与站点联系来检查致命错误,因此PHP修改已被回滚。您需要采用其他方式(如SFTP)上传您修改的PHP文件。"这个问题.

2.修改:file.php程序文件,可操作指数:✭ ✭ ✭ ✭

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

  1. if ( $is_active && 'php' === $extension ) {
  2.         $scrape_key   = md5( rand() );
  3.         $transient    = 'scrape_key_' . $scrape_key;
  4.         $scrape_nonce = strval( rand() );
  5.         // It shouldn't take more than 60 seconds to make the two loopback requests.
  6.         set_transient( $transient, $scrape_nonce, 60 );
  7.         $cookies       = wp_unslash( $_COOKIE );
  8.         $scrape_params = array(
  9.             'wp_scrape_key'   => $scrape_key,
  10.             'wp_scrape_nonce' => $scrape_nonce,
  11.         );
  12.         $headers       = array(
  13.             'Cache-Control' => 'no-cache',
  14.         );
  15.         /** This filter is documented in wp-includes/class-wp-http-streams.php */
  16.         $sslverify = apply_filters( 'https_local_ssl_verify', false );
  17.         // Include Basic auth in loopback requests.
  18.         if ( isset( $_SERVER['PHP_AUTH_USER'] ) && isset( $_SERVER['PHP_AUTH_PW'] ) ) {
  19.             $headers['Authorization'] = 'Basic ' . base64_encode( wp_unslash( $_SERVER['PHP_AUTH_USER'] ) . ':' . wp_unslash( $_SERVER['PHP_AUTH_PW'] ) );
  20.         }
  21.         // Make sure PHP process doesn't die before loopback requests complete.
  22.         set_time_limit( 300 );
  23.         // Time to wait for loopback requests to finish.
  24.         $timeout = 100;
  25.         $needle_start = "###### wp_scraping_result_start:$scrape_key ######";
  26.         $needle_end   = "###### wp_scraping_result_end:$scrape_key ######";
  27.         // Attempt loopback request to editor to see if user just whitescreened themselves.
  28.         if ( $plugin ) {
  29.             $url = add_query_arg( compact( 'plugin', 'file' ), admin_url( 'plugin-editor.php' ) );
  30.         } elseif ( isset( $stylesheet ) ) {
  31.             $url = add_query_arg(
  32.                 array(
  33.                     'theme' => $stylesheet,
  34.                     'file'  => $file,
  35.                 ),
  36.                 admin_url( 'theme-editor.php' )
  37.             );
  38.         } else {
  39.             $url = admin_url();
  40.         }
  41.         $url                    = add_query_arg( $scrape_params, $url );
  42.         $r                      = wp_remote_get( $url, compact( 'cookies', 'headers', 'timeout', 'sslverify' ) );
  43.         $body                   = wp_remote_retrieve_body( $r );
  44.         $scrape_result_position = strpos( $body, $needle_start );
  45.         $loopback_request_failure = array(
  46.             'code'    => 'loopback_request_failed',
  47.             '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.' ),
  48.         );
  49.         $json_parse_failure       = array(
  50.             'code' => 'json_parse_error',
  51.         );
  52.         $result = null;
  53.         if ( false === $scrape_result_position ) {
  54.             $result = $loopback_request_failure;
  55.         } else {
  56.             $error_output = substr( $body, $scrape_result_position + strlen( $needle_start ) );
  57.             $error_output = substr( $error_output, 0, strpos( $error_output, $needle_end ) );
  58.             $result       = json_decode( trim( $error_output ), true );
  59.             if ( empty( $result ) ) {
  60.                 $result = $json_parse_failure;
  61.             }
  62.         }
  63.         // Try making request to homepage as well to see if visitors have been whitescreened.
  64.         if ( true === $result ) {
  65.             $url                    = home_url( '/' );
  66.             $url                    = add_query_arg( $scrape_params, $url );
  67.             $r                      = wp_remote_get( $url, compact( 'cookies', 'headers', 'timeout' ) );
  68.             $body                   = wp_remote_retrieve_body( $r );
  69.             $scrape_result_position = strpos( $body, $needle_start );
  70.             if ( false === $scrape_result_position ) {
  71.                 $result = $loopback_request_failure;
  72.             } else {
  73.                 $error_output = substr( $body, $scrape_result_position + strlen( $needle_start ) );
  74.                 $error_output = substr( $error_output, 0, strpos( $error_output, $needle_end ) );
  75.                 $result       = json_decode( trim( $error_output ), true );
  76.                 if ( empty( $result ) ) {
  77.                     $result = $json_parse_failure;
  78.                 }
  79.             }
  80.         }
  81.         delete_transient( $transient );
  82.         if ( true !== $result ) {
  83.             // Roll-back file change.
  84.             file_put_contents( $real_file, $previous_content );
  85.             if ( function_exists( 'opcache_invalidate' ) ) {
  86.                 opcache_invalidate( $real_file, true );
  87.             }
  88.             if ( ! isset( $result['message'] ) ) {
  89.                 $message = __( 'Something went wrong.' );
  90.             } else {
  91.                 $message = $result['message'];
  92.                 unset( $result['message'] );
  93.             }
  94.             return new WP_Error( 'php_error', $message, $result );
  95.         }
  96.     }

然后替换原来文件,即可解决,删除后不会对其它功能造成影响。这个福利老幺亲测可行.

只不过,每次更新升级Wordpress后,可能会都要去修改这个文件.

另外,据说还有一些插件,也有可能会造成这样的提示,分别是下面这些:

  1. Magic Fields
  2. WP Spamshield
  3. GeoDirectory
  4. Social Login WordPress Plugin – AccessPress Social Login Lite
  5. Ninja Popups for WordPress
  6. Custom firewalls or security rules
  7. Some custom themes
  8. ShortPixel Optimizer
  9. WP Server Stats

当然,如果如果你没有装这个插件也遇到了这个问题,可能是其他插件的兼容性问题,建议依次禁用插件,看看到底是哪个插件的问题。

给我留言