我的客户端最近将一个非常基本的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
.在该测试分支中,我直接从WordPress手动下载了一个百分之百的WordPress 5.6.1安装,手动将干净的文件复制到新分支中并提交它们然后我跑了本地git diff master..test
查看源之间更改了哪些文件master
分支机构和test
树枝diff表示,来自服务器的文件与干净的WordPress 5.6.1文件完全相同;服务器上的内容与干净的WordPress安装完全相同
最合适的回答,由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<---