首页 › 博客 › 文章

WordPress 换域名:搜索替换怎么做才不会把数据搞坏

WordPress 换域名:搜索替换怎么做才不会把数据搞坏

换域名前先备份数据库;用 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 若含短代码属性也会序列化。所以必须按「先反序列化、替换、再序列化」或等价的安全替换来做。

排查流程:从备份到验证的六步

  1. 整库备份并确认可恢复:wp db export pre-domain-change.sql。
  2. 用 WP-CLI 做带序列化的搜索替换,指定所有表。
  3. 更新 wp-config.php 或环境变量里的域名常量(如有硬编码)。
  4. 配置旧域到新域的 301 跳转,保留权重。
  5. 检查内外链、媒体地址、菜单与自定义文章类型。
  6. 抽样查 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 与验证全流程。

参考资料与延伸阅读

WPDaiwei

WPDaiwei-专业Wordpress网站定制开发提供商

需要 WordPress 开发服务?

24 小时内免费出方案与报价,国内国外都接单。

QQ