
文章目录
换域名前先备份数据库;用 WP-CLI 的 search-replace 处理序列化字段,禁止裸 SQL 文本替换;改完核对外链、媒体路径与旧域 301;用 SQL 抽样与页面抽查验证,失败则导回备份。
现象与快速定位:先看是不是替换坏了
站点搬家后前台白屏、后台样式丢失、小工具消失、菜单错乱,八成是数据库里的序列化字符串被纯文本替换搞坏了长度。先别改代码,连上服务器确认。
用 WP-CLI 查当前站点地址,并抽一条 option 看是否异常:
wp option get home
wp option get siteurl
wp db query "SELECT option_value FROM wp_options WHERE option_name='widget_text' LIMIT 1;"若返回里出现 s:xx:"..." 但引号内域名已被截断,或 PHP 报 unserialize(): Error at offset,就是典型序列化损坏。再看媒体库:进 wp_postmeta 查 _wp_attached_file 是否还指向旧域。
序列化数据为什么不能纯文本替换
WordPress 把数组、对象存成 PHP 序列化串,格式是 类型:长度:"值"。比如 a:1:{s:5:"email";s:15:"a@old.com";}。长度 15 对应 a@old.com 的字符数。
若把 old.com 换成 newdomain.com,纯文本替换后变成 s:15:"a@newdomain.com",但真实串已 19 字符,PHP 反序列化按 15 去截,直接断在中间,整条数据报废。
受影响的常见位置:wp_options 里的 theme_mods、widget_*;wp_postmeta 的 _wp_attachment_metadata、自定义字段;wp_posts 的 post_content 若含短代码属性也会序列化。所以必须按「先反序列化、替换、再序列化」或等价的安全替换来做。
排查流程:从备份到验证的六步
- 整库备份并确认可恢复:
wp db export pre-domain-change.sql。 - 用 WP-CLI 做带序列化的搜索替换,指定所有表。
- 更新 wp-config.php 或环境变量里的域名常量(如有硬编码)。
- 配置旧域到新域的 301 跳转,保留权重。
- 检查内外链、媒体地址、菜单与自定义文章类型。
- 抽样查 SQL 与前台页面,确认无 unserialize 报错。
正确工具与方法:用 WP-CLI 做安全替换
2026 年 WP-CLI 仍是官方推荐命令行工具,search-replace 子命令原生处理序列化。别用 phpMyAdmin 的替换、也别写裸 UPDATE。
标准操作,先 dry-run 看影响行数:
获取报价
邮箱 + 需求 + 预算区间,24 小时内回复报价。
wp search-replace 'https://old.com' 'https://new.com' --all-tables --dry-run
wp search-replace 'https://old.com' 'https://new.com' --all-tables若用了多站点,加 --network;若表前缀非 wp_,加 --all-tables-with-prefix 或显式表名。想跳过某表用 --exclude-tables=wp_users。
替换完立刻查有没有残留:wp db query "SELECT COUNT(*) FROM wp_options WHERE option_value LIKE '%old.com%';"。日常批量运维可配合我们在 WP-CLI 常用命令:把重复的运维动作变成一行命令 里整理的清单,把这类动作固化成一行。
没有 SSH 的环境,用官方支持的 WP-CLI 命令文档 同逻辑的替代脚本,或临时装 WP-CLI phar。切忌直接改库。
旧域名 301:把权重和入口接住
替换完不代表旧链接失效可不管。旧域必须 301 到新域对应路径,否则搜索排名与用户收藏全丢。
Nginx 配置片段,放在旧域 server 块:
server {
listen 80;
server_name old.com www.old.com;
return 301 https://new.com$request_uri;
}Apache 则在旧域根目录 .htaccess 写:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(www.)?old.com$ [NC]
RewriteRule ^(.*)$ https://new.com/$1 [R=301,L]验证: curl -I http://old.com/sample-page 应返回 301 且 Location 指向新域同路径。别用 302,也别全站跳首页。
内外链与媒体地址检查

替换只是改了库里的绝对地址,还要确认没有漏网。
查内链: wp db query "SELECT ID,post_title FROM wp_posts WHERE post_content LIKE '%old.com%' LIMIT 10;"。有结果说明 post_content 里还有硬编码,多半是古腾堡块外的 HTML,需再跑一次针对 wp_posts 的替换。
查媒体: wp db query "SELECT meta_id,meta_value FROM wp_postmeta WHERE meta_key='_wp_attached_file' AND meta_value LIKE '%old.com%';"。媒体地址一般只存相对路径,若出现域名说明之前被硬写,要一并处理。
前台抽查:打开页面看图片是否 404,浏览器 DevTools 里 Network 面板过滤 img,有旧域请求就是没换干净。菜单、主题自定义项(theme_mods)进后台看一眼是否复位。
若站点还接了 CDN,缓存里的旧 HTML 会让人误判,可参考 WordPress 接 CDN:缓存规则、回源与清缓存策略 清一遍再测。
实施步骤:失败回退与动作清单
真出问题了别慌。用备份回滚是最快路径:
wp db import pre-domain-change.sql
wp cache flush若只坏了个别 option,可单独重设: wp option update widget_text '' 清空后后台重配。回滚后先查 Nginx/Apache 是否还指到旧目录,再重走排查流程。
日常要迁移整套环境,可直接用我们的 WordPress 网站迁移 服务,省去命令行试错成本。
常见问题
纯文本替换后序列化坏了怎么补救?
有整库备份就 wp db import 回退;没备份只能写脚本按表重建受损字段,代价很大,所以替换前必须导出。
WP-CLI 的 search-replace 会动用户表吗?
默认动所有表,但用户邮箱等一般不含域名;若担心用 --exclude-tables 排除,或先 dry-run 看行数。
换完域名后台进不去怎么办?
多半 siteurl 没生效,执行 wp option update siteurl 'https://new.com' 与 home 同值,再清缓存重试。
可执行动作清单
- 迁移前执行
wp db export并下载到本地。 - 用
wp search-replace带--dry-run跑两遍再实换。 - 旧域配 301,curl 验证 Location 正确。
- SQL 抽样查 options/postmeta/posts 无旧域残留。
- 前台抽查图片、菜单、小工具,异常即回滚。
需要专业团队接手域名更换与迁移?见 WordPress 网站迁移服务,我们提供备份、替换、301 与验证全流程。
