用 WP-CLI 迁移 WordPress 的本质就是三条命令加一次文件同步:源站 wp db export 导出 SQL、rsync 同步 wp-content、新站 wp db import 后跑一遍 wp search-replace 换域名。整个流程纯命令行、可脚本化,1GB 以内的中小型站点从导出到新站可访问通常 10~20 分钟完成,比插件迁移少一层 PHP 超时风险。
迁移前要确认哪些环境和版本信息?
结论:源站和目标站都必须能正常执行 wp --info,且目标站 PHP 版本不低于源站,否则导入后容易白屏。
先在源站执行以下三条命令记录基线:
wp --info # 查看 WP-CLI 版本、PHP 版本、WordPress 路径
wp core version # 记录 WP 版本号,迁移后对齐
wp option get siteurl && wp option get home
WP-CLI 建议 2.7.0 以上版本,wp db export --gzip、wp search-replace --precise 都依赖较新的实现。如果当前是 root 用户执行,每条命令都要追加 --allow-root,否则 WP-CLI 会直接拒绝运行。目标站目录必须先有 wp-config.php,没有的话用 wp config create --dbname=xxx --dbuser=xxx --dbpass=xxx --dbhost=localhost 生成。
源站怎么导出数据库和文件?
结论:数据库用 wp db export 导出,文件用 rsync 同步 wp-content,两边分开处理比整站打包更可控。
导出前先做一次完整性检查,避免导出一份损坏的 SQL:
wp db check
wp db export /tmp/site.sql --add-drop-table --default-character-set=utf8mb4
gzip /tmp/site.sql
如果数据库大于 500MB,直接用管道压缩,避免磁盘写满:wp db export - | gzip > site.sql.gz。
文件部分只同步 wp-content(含 themes、plugins、uploads),核心文件在新站用 wp core download --locale=zh_CN --version=6.x 重新拉一份更干净:
rsync -avz --progress wp-content/ user@新服务器:/var/www/newsite/wp-content/
同步时排除 wp-content/cache、wp-content/upgrade 这类临时目录,能省掉大量无效传输。
换域名为什么必须用 search-replace 而不是直接改数据库?
结论:WordPress 大量配置项以序列化数组存储,手工 UPDATE 会破坏序列化字符串的长度前缀,导致主题设置、小工具、插件配置全部丢失,必须用 wp search-replace。
标准顺序是:新站先建库、导入 SQL,再执行替换。
wp db create
wp db import site.sql.gz
wp search-replace 'old.com' 'new.com' --all-tables --precise --report-changed-only --skip-columns=guid
三个参数的作用:--all-tables 覆盖非 WordPress 表;--precise 走 PHP 反序列化再重新序列化,是处理序列化数据的正确姿势;--skip-columns=guid 保留原始文章 GUID,避免已收录文章的 RSS 唯一标识变化。正式执行前先加 --dry-run 预演一次,看会改动多少行。
如果同时更换了表前缀,把 --all-tables 换成 --all-tables-with-prefix=wp_。
wp-config.php 里写死了域名怎么办?
结论:只要 wp-config.php 中定义了 WP_HOME 或 WP_SITEURL 常量,数据库里的地址替换就不会在前台生效,表现为新站仍跳回旧域名。
用 wp config get WP_HOME 和 wp config get WP_SITEURL 检查,有定义就改成新域名,或直接删除这两行让数据库配置接管。这一步漏掉是迁移后「首页跳回旧站」的最高频原因。
迁移后必须跑的收尾命令有哪些?
结论:四类收尾动作——数据库升级、固定链接刷新、缓存清理、临时数据清理,缺一条都可能出现 404 或样式错乱。
wp core update-db
wp rewrite flush --hard
wp cache flush
wp transient delete --all
如果新站启用了 HTTPS,再补一条 wp search-replace 'http://new.com' 'https://new.com' --all-tables --precise 处理混合内容。图片缩略图丢失时执行 wp media regenerate --only-missing,只重建缺失尺寸,速度比全量快数倍。最后用 wp user list --role=administrator 确认管理员账号可登录。
迁移过程中几个容易踩的坑
结论:大文件传输和附件体积是迁移失败的两大来源,用 scp/rsync 而非网页上传,可以绕开绝大部分限制。
整站 SQL 动辄上百 MB,不要试图通过论坛或后台的附件上传通道传输——GJ 站长论坛的普通附件单个上限是 10MB,图片是 5MB,这类文件应该走 rsync 或 scp。多站点网络迁移时先用 wp site list 列出全部子站,再对每张表单独执行 wp search-replace,不要一次性全局替换。迁移完成前不要在新站安装或更新插件,等域名替换和缓存清理做完再操作,否则容易把旧域名写回数据库。
把上述步骤写成 shell 脚本后,下次同架构迁移只需改三个变量(旧域名、新域名、目标路径),这也是 WP-CLI 相比插件迁移最大的价值:过程可复现、可版本化。遇到具体报错,可以在 GJ 站长论坛的运维与建站版块发帖,附上 wp --info 输出和完整命令,定位速度会快很多。