如何快速使系统显示“未捕获错误:未找到类‘WP_SITE_Health’Not Found in”并重新运行?

时间:2021-02-07 作者:Giacomo1968

我的客户端最近将一个非常基本的WordPress安装升级到了5.6.1版本。虽然更新似乎进行得很顺利,但就在最后,该网站死于这样的错误;识别为隐私而更改的详细信息:

[Sat Feb 06 12:12:11.123456 2021] [fcgid:warn] [pid 128] [client 12.34.56.78:12345] mod_fcgid: stderr: PHP Fatal error:  Uncaught Error: Class \'WP_Site_Health\' not found in /var/www/html/wp-includes/rest-api.php:321
我在调试WordPress和相关PHP站点方面有着相当深入的经验,但这让我感到困惑。据他们介绍,他们禁用了所有插件和主题,甚至下载了WordPress 5.6.1的干净归档,并进行了基本的手动升级过程,以保留wp-config.php, .htaccess 以及在wp-content 目录,错误仍然显示。

我读过这样的建议what was posted here on the WordPress forums 这基本上说明了应该从备份中恢复并重试,但发现这是一个经典的建议”Hail Mary” 玩有时它可以工作,而有时你只是停留在与以前相同的位置,但有新的文件修改日期。

所以考虑到WP_Site_Health 和文件wp-includes/rest-api.php 如果这两项都存在于核心WordPress中,如何快速修补系统以使其重新工作?

另外,为了真正确认这些文件没有问题,我做了以下工作:

创建了整个WordPress安装的Tar/Gzip存档-包括所有wp-content 项目-并将其下载到我的桌面git init 在其中创建Git回购master 然后创建了一个名为test.git diff master..test 查看源之间更改了哪些文件master 分支机构和test 树枝diff表示,来自服务器的文件与干净的WordPress 5.6.1文件完全相同;服务器上的内容与干净的WordPress安装完全相同

2 个回复
最合适的回答,由SO网友:Giacomo1968 整理而成

解决方案是添加一个PHPclass_exists 检查管线321周围wp-includes/rest-api.php.

当我像这样修补WordPress core时,我退缩了,我添加的检查只是确认WP_Site_Health 存在于加载以呈现自身的WordPress代码中。以下是核心WordPress代码第321行的内容wp-includes/rest-api.php:

// Site Health.
$site_health = WP_Site_Health::get_instance();
$controller  = new WP_REST_Site_Health_Controller( $site_health );
$controller->register_routes();
以下是我为使网站恢复并运行所做的调整:

// Site Health.
if ( ! class_exists( \'WP_Site_Health\' ) ) {
    require_once ABSPATH . \'wp-admin/includes/class-wp-site-health.php\';
}
$site_health = WP_Site_Health::get_instance();
$controller  = new WP_REST_Site_Health_Controller( $site_health );
$controller->register_routes();
逻辑非常简单:使用PHP函数class_exists, 代码只是检查WP_Site_Health 是否存在。如果它不存在,WordPress将使用require_once 然后继续。是否存在?条件失败了,就是这样。

如果你看看wp-settings.php 加载WordPress时,它会引导所有类-rest-api.php 在第240行附近加载,但拨打WP_Site_Health 在第539行附近。为什么会rest-api.php — 先加载哪个-调用WP_Site_Health 仅在以后的require 列表

无论如何,这并不漂亮,但它可以工作,并且应该是无害的添加,以快速建立并重新运行一个网站。

SO网友:Alexandre Schmidt

看看您的代码中调用WordPress REST API或任何其他使用WP_Site_Health.

如果你在家里打电话<theme>/functions.php 例如,它不会工作,因为functions.php 之前包含class WP_Site_Health 在里面wp-settings.php.

看见wp-settings.php 代码(WordPress 5.7.2):

// Load the functions for the active theme, for both parent and child theme if applicable.
foreach ( wp_get_active_and_valid_themes() as $theme ) {
    if ( file_exists( $theme . \'/functions.php\' ) ) {
        include $theme . \'/functions.php\';
    }
}
unset( $theme );

/**
 * Fires after the theme is loaded.
 *
 * @since 3.0.0
 */
do_action( \'after_setup_theme\' );

// Create an instance of WP_Site_Health so that Cron events may fire.
if ( ! class_exists( \'WP_Site_Health\' ) ) {
    require_once ABSPATH . \'wp-admin/includes/class-wp-site-health.php\';
}
WP_Site_Health::get_instance();
尽管缺乏优雅,但可以做的一件事是通过复制wp-settings.php 并将其粘贴到代码之前。例如,在<theme>/functions.php, 您可以这样做:

if ( ! class_exists( \'WP_Site_Health\' ) ) {
    require_once ABSPATH . \'wp-admin/includes/class-wp-site-health.php\';
}
WP_Site_Health::get_instance();

---8<---
code depending on WP_Site_Health
---8<---

相关推荐

WordPress updates

WordPress如何知道插件属于WordPress插件库,并且需要从WordPress SVN中获取更新?另一方面,它如何知道另一个插件不属于存储库?