直接修改 wp_options 表中 active_plugins 的序列化值可强制禁用插件:清空为 a:0:{} 或精准移除问题插件路径,注意格式合法、备份数据、清理相关选项及对象缓存。
直接进 wp_options 表禁用插件,别等后台能打开
wordpress 插件崩溃导致后台 500 或白屏时,wp-admin 根本打不开,此时不能靠“停用所有插件”按钮——得绕过 php 执行层,直改数据库。phpmyadmin 是最常用且无需 ssh 的方案。
核心操作是修改 active_plugins 这个 option_name 对应的序列化值,把它清空或替换成安全插件列表。
- 在 phpMyAdmin 中选中 WordPress 数据库 → 找到
wp_options表(前缀可能不是wp_,请确认实际前缀) - 搜索
option_name = 'active_plugins',通常只有一条记录 - 点击
Edit,把option_value字段内容全删掉,替换成:a:0:{}(这是空数组的合法 PHP 序列化字符串) - 注意:不要用 JSON 或纯空字符串,WordPress 只认
unserialize()得过去的格式
如果只想禁用某一个插件,别清空全部
全清空虽快,但会丢失所有插件启用状态。若你已定位到问题插件(比如 bad-plugin/evil.php),可以精准移除它,保留其他插件状态。
原 option_value 是类似这样的序列化数组:a:3:{i:0;s:19:"akismet/akismet.php";i:1;s:27:"bad-plugin/evil.php";i:2;s:22:"jetpack/jetpack.php";}
- 复制当前值,在本地用 PHP 的
unserialize()解析(或在线反序列化工具),确认目标插件键名(如i:1) - 手动删掉对应项(含前面的
i:1;s:27:"bad-plugin/evil.php";),再重新序列化 —— 推荐用 PHP 脚本生成,避免手算长度出错 - 更稳妥的做法:临时建个最小 WordPress 环境,用
var_export( array_values( array_diff( $current, [ 'bad-plugin/evil.php' ] ) ) );输出数组,再用serialize()包一层
修改后仍 500?检查 wp_options 表里的其他坑
有些插件会在激活时写入额外选项(如 plugin_name_activation_flag 或 rewrite_rules),即使插件没启用,残留数据也可能触发 fatal error。
立即学习“PHP免费学习笔记(深入)”;
- 搜索
option_name LIKE '%bad-plugin%'或option_name LIKE '%evil%',删掉相关行(先备份整表) - 特别留意
rewrite_rules:它被缓存且常因插件错误写入非法正则,导致 Apache/Nginx 返回 500;清空该值(设为a:0:{})可快速验证是否为此原因 - 如果使用了对象缓存(Redis/Memcached),数据库改完还得清空缓存,否则 WordPress 可能仍读旧值
恢复启用插件时,别直接粘贴旧序列化字符串
从备份里抄回旧 option_value 是常见错误——如果那段序列化数据本身包含已删除文件路径(比如插件目录已被手动删掉),activate_plugins() 在加载时仍会 fatal。
- 确认所有插件文件物理存在,且主文件头注释未被破坏(尤其是
Plugin Name:行) - 更安全的方式:清空
active_plugins后,用 WP-CLI 执行wp plugin activate plugin-slug,它会做完整校验 - 如果只能用 phpMyAdmin,至少用
serialize( array_filter( $list, 'validate_plugin' ) )逻辑预处理一遍(需本地验证)
序列化字符串里路径长度错一位、多一个空格,都会让 unserialize() 返回 false,WordPress 就当没插件启用——这种静默失败最难排查。



















