wp-cli search-replace 替换后网站白屏是因为未处理序列化数据,导致 wp_options 等表中 PHP 序列化字符串长度失配而反序列化失败;必须使用 --serialize 参数(旧版本需显式声明),并配合 --dry-run 预览、--all-tables-with-prefix(多站点)等安全选项。
wp-cli search-replace 为什么替换后网站白屏
直接用 wp-cli search-replace 替换域名,但没处理序列化数据,会导致 wp_options 或自定义字段里的 php 序列化字符串损坏——比如 a:1:{s:4:"name";s:5:"admin";} 中的长度值没同步更新,反序列化失败,wordpress 直接报错终止加载。
实操建议:
- 必须加
--serialize参数(wp-cli v2.0+ 默认开启,但旧版本或某些托管环境需显式声明) - 避免在生产库上直接执行,先用
--dry-run预览变更 - 如果用的是 MySQL 命令行或 phpMyAdmin 手动替换,绝对不要跳过序列化修复步骤——那等于埋雷
MySQL 替换语句无法修复 serialized 数据
像 UPDATE wp_options SET option_value = REPLACE(option_value, 'http://localhost', 'https://example.com'); 这类 SQL 会破坏序列化结构:字符串长度不变,但内容变长/变短,s:12:"old-domain" 变成 s:12:"new-domain.com" 就直接失效。
常见错误现象:
- 后台登录页能打开,但进仪表盘后空白,PHP 错误日志出现
unserialize(): Error at offset - 主题选项、页面构建器(如 Elementor)保存的内容消失或乱码
正确做法只有两个选择:
- 用支持序列化感知的工具:优先
wp-cli search-replace(带--all-tables和--network如需多站点) - 用专用 PHP 脚本(如
interconnectit/Search-Replace-DB),它会解析并重写序列化字符串,不是简单文本替换
HTTPS 域名迁移后后台重定向循环
数据库里替换了 siteurl 和 home,但 WordPress 还是跳回 HTTP 地址,甚至出现 301 重定向死循环。
原因往往不在数据库,而在配置或服务器层:
生产级WordPress REST API集成,用于管理文章、页面、媒体、WooCommerce产品、Elementor内容、SEO元数据、ACF及JetEngine字段
-
wp-config.php中硬编码了define('WP_HOME', ...)或define('WP_SITEURL', ...),会覆盖数据库值 - 反向代理(如 Nginx + Cloudflare)没传
X-Forwarded-Proto,导致 WordPress 认为自己跑在 HTTP 上,生成的链接和重定向全错 - 缓存插件(如 WP Super Cache)缓存了旧的 301 重定向规则,清完数据库还得清对象缓存和页面缓存
检查顺序建议:
- 临时注释掉
wp-config.php中所有WP_HOME/WP_SITEURL定义 - 在
wp-config.php顶部加:$_SERVER['HTTPS'] = 'on';(仅调试用,上线前删掉或换成条件判断) - 确认 Nginx/Apache 配置里有传递协议头,例如 Nginx:
proxy_set_header X-Forwarded-Proto $scheme;
多站点(Multisite)子域名迁移时 site_id 混乱
把本地 local.dev 多站点迁到线上 example.com,主站正常,但子站点打不开,或者后台显示“该站点不存在”。
关键点在于:多站点不只改 wp_blogs 表的 domain 字段,还要同步更新 wp_site 表的 domain,以及每个子站点对应 wp_{blog_id}_options 表里的 siteurl 和 home。
容易被忽略的地方:
-
wp-cli search-replace默认不处理wp_{blog_id}_*动态表名,必须加--all-tables-with-prefix(注意不是--all-tables) - 如果用了子目录模式(
example.com/site1),要额外检查wp_blogs的path字段是否含本地路径(如/localdev/) - 迁移后首次访问子站点,WordPress 可能因
rewrite_rules缓存未刷新而 404,进主站后台「设置 → 固定链接」点一次保存即可刷新
序列化问题在多站点里更隐蔽——主题设置、插件网络启用状态、用户元数据都可能藏在序列化字段里,别信“只改几个字段就够了”这种说法。










