网站运维

WordPress 更新后白屏或 500 错误:5 分钟定位法

点了一下「更新」,刷新,白屏。或者一个大大的 500 Internal Server Error。

后台也进不去了。这时候心跳会加速——尤其是这个站正在跑广告、正在接询盘的时候。

先说结论:90% 的情况不是数据丢了,是某个插件或主题跟新版本不兼容。数据都在数据库里,网站只是跑不起来。不要重装,不要从备份恢复(先别急),按下面的顺序来。

第一步:先开错误显示(30 秒)

白屏的本质是「PHP 报错了但错误被隐藏了」。你要做的第一件事是让它把错误说出来。

编辑网站根目录的 wp-config.php,找到这行:

define( 'WP_DEBUG', false );

改成:

define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', true );

刷新页面。这时候你会看到真正的错误信息,比如:

Fatal error: Cannot redeclare get_products() (previously declared in ...)

这一条信息值千金——它直接告诉你哪个文件、哪个函数出问题了。文件名里通常就带着插件或主题的名字。

如果错误里能看到 /wp-content/plugins/某某插件/,直接跳到第三步。

注意:查完之后记得把 WP_DEBUG_DISPLAY 改回 false,不然访客也能看到你的报错信息(安全事故)。

第二步:确认是插件还是主题(不用登录后台)

后台进不去没关系,用 FTP 或文件管理器直接改文件夹名。

先禁掉所有插件

把 /wp-content/plugins 这个文件夹改名为 plugins-off。

然后刷新网站:

  • 网站恢复了 → 是插件的问题,进第三步
  • 还是白屏 → 不是插件的问题,把名字改回来,进第四步

WordPress 找不到 plugins 目录时会自动禁用所有插件,但插件的设置数据都还在数据库里,改回名字后数据不丢。这是最安全的一招。

再切回默认主题

如果上面确认不是插件问题,把 /wp-content/themes/你现在的主题 改名。

WordPress 找不到当前主题时会自动回退到默认主题(比如 Twenty Twenty-Four,前提是它还在)。

  • 恢复了 → 主题的问题
  • 还是白屏 → WordPress 核心文件或服务器环境的问题,进第五步

第三步:找出是哪个插件(二分法)

把 plugins-off 改回 plugins,然后进去把插件一个个改名来试?太慢了。

更快的方法:把插件目录里的文件夹全部改名,然后一半一半地改回来。

  1. 全部改名(相当于全禁用)
  2. 把其中一半改回原名,刷新测试
  3. 如果坏了,问题在这一半里;如果没坏,在另一半里
  4. 对有问题的那一半重复这个操作

10 个插件,3 次就能定位到具体的那个。比一个个试快得多。

找到之后:

  • 去插件官网看有没有更新版本
  • 看它的「最近更新时间」和「兼容版本」——如果是个两年没更新的插件,趁早换掉,迟早还会出问题

第四步:主题问题怎么处理

如果是主题导致的,而且你改过主题文件(尤其是 functions.php):

  • 回想最近改了什么,还原那处修改
  • 如果是买的商业主题,去官网下载最新版覆盖
  • 如果是子主题的 functions.php 报错,检查语法——少一个分号、多一个括号都会白屏

强烈建议:以后所有主题定制都放在子主题里,这样主题更新不会冲掉你的改动,出问题也好定位。

第五步:核心和环境问题

PHP 版本不兼容

最常见的隐藏杀手。你把 PHP 从 7.4 升到 8.2,结果某个老插件用了废弃语法,直接 Fatal error。

排查:宝塔面板 → 软件商店 → PHP → 切换版本,退回原来的版本试试。

教训:升级 PHP 之前,先在测试环境跑一遍。没有测试环境的话,至少挑在流量最低的时候做,并且先做完整备份。

PHP 内存耗尽

错误信息如果带 Allowed memory size of ... exhausted,是内存限制太低。

在 wp-config.php 加:

define( 'WP_MEMORY_LIMIT', '256M' );

或者在宝塔的 PHP 设置里改 memory_limit。

核心文件损坏

更新过程中网络中断、磁盘满了,都可能导致核心文件只写了一半。

解决:下载同版本的官方 WordPress 包,解压,把 wp-admin 和 wp-includes 两个目录覆盖上去(wp-content 不要动)。

第六步:实在不行,用备份回滚

如果上面都没搞定,这时候才动备份。

关键原则:回滚前先把现在的数据库导出来存一份。因为你可能在白屏之前已经产生了新订单/新询盘,直接回滚会把这些数据一起抹掉。

mysqldump -u用户名 -p 数据库名 > /root/before-rollback-$(date +%F).sql

回滚后,如果有新增数据需要补回来,可以对比两份数据库手动补。

怎么让它不再发生:正确的更新姿势

大部分白屏事故,都是因为「看到更新提示就点了,没做任何准备」。正确流程:

  1. 更新前先备份(文件和数据库,异地存一份)——1 分钟的事
  2. 先看更新内容:插件的更新日志里有没有写「重大变更」
  3. 分批更新:不要一次性把所有插件都点了。一次更新 1-2 个,每更新完刷新看一眼。这样出问题时你马上知道是谁
  4. 挑时间:在流量低谷期更新。国内站的深夜,外贸站看你的主要客户时区
  5. 核心大版本更新先观望两周:WordPress 主版本(比如 6.7 → 6.8)刚发布时,插件生态往往还没跟上。让别的站先踩坑

最后说一句

白屏这件事,技术本身不难,难的是慌了之后乱操作。最常见的恶化路径是:白屏了 → 立刻恢复备份 → 发现备份是三个月前的 → 数据丢了三个月。

记住这个顺序:开错误显示 → 禁插件 → 切主题 → 查 PHP 版本 → 最后才动备份。按这个走,基本不会丢数据。