迁移 WordPress multisite 多站点网络,唯一正确的做法是“整库 + 整文件 + 手工改配置”三件套一起搬,绝不能像单站点那样用导出插件只导出主站内容。多站点网络中的所有子站共享一套数据库表结构(wp_blogs、wp_site、wp_sitemeta 加上各子站的 wp_2_posts、wp_2_options 等),少导一张表就会导致全网络崩溃。
为什么多站点不能用单站点插件一键迁移?
结论:单站点迁移插件默认只处理主站表前缀(如 wp_),会漏掉 wp_2_、wp_3_ 等子站表和 wp_blogs、wp_sitemeta 这类网络级表,迁移完成后子站会全部消失或变成空站。
判断一个站是不是 multisite,看 wp-config.php 里有没有 define( 'MULTISITE', true );。有这一行,就必须按网络整体迁移。Duplicator 免费版、All-in-One WP Migration 基础版都不支持 multisite 的完整结构;需要用 WP-CLI 手动完成,或者使用明确支持 multisite 的商业版本。
迁移前先在旧站执行一次备份,把文件和数据库分别独立备份:
wp db export backup.sql --single-transaction
tar -czf files.tar.gz wp-content wp-config.php .htaccess
multisite 迁移的完整步骤是什么?
结论:按“建库 → 导 SQL → 传文件 → 改 wp-config → 改 .htaccess → 替换域名 → 刷新缓存”这七步走,顺序不能颠倒。
- 新服务器上
CREATE DATABASE,建好同名库和用户,字符集用 utf8mb4。
- 导入数据库:
wp db import backup.sql(或 mysql -u user -p dbname < backup.sql)。导入后必须核对表数量,子站数量乘以每个子站的表数再加网络表,比原库少了就是没导全。
- 上传文件。重点检查上传目录:WP 3.5 之后是
wp-content/uploads/sites/{blog_id}/,老站可能是 wp-content/blogs.dir/{blog_id}/files/,后者需要额外配置 BLOGUPLOADDIR 或改用 ms-files.php 兼容。
- 改
wp-config.php 的数据库常量和多站点常量:
define( 'MULTISITE', true );
define( 'SUBDOMAIN_INSTALL', false ); // 子域名模式填 true
define( 'DOMAIN_CURRENT_SITE', 'newdomain.com' );
define( 'PATH_CURRENT_SITE', '/' );
define( 'SITE_ID_CURRENT_SITE', 1 );
define( 'BLOG_ID_CURRENT_SITE', 1 );
AUTH_KEY 等 8 个盐值要与旧站保持一致,否则所有用户登录状态失效,全部被强制重新登录。
- 重写
.htaccess。子目录模式用 WordPress 官方规则,子域名模式只需 RewriteRule . index.php [L] 那条精简规则。
- 替换域名,这一步最容易出错,见下一节。
- 执行
wp cache flush 和 wp rewrite flush --hard,清掉对象缓存和伪静态规则。
换域名时怎么改才不会破坏数据?
结论:必须用 wp search-replace 处理,禁止直接执行 UPDATE ... REPLACE() 或 sed 替换 SQL 文件,否则序列化数据会被打断。
WordPress 把 options、widget 配置等存成 PHP 序列化字符串,格式是 s:20:"http://old.com/a";,其中的数字是字符串字节长度。直接做 SQL 字符串替换只改内容不改长度,反序列化时长度校验失败,整条 option 会被读成 false,表现为主题设置清空、菜单丢失、插件配置全丢。
正确命令:
wp search-replace 'old.com' 'new.com' \
--all-tables --precise --recurse-objects \
--skip-columns=guid --report-changed-only
--all-tables 是必须的,它保证 wp_blogs、wp_sitemeta 和各子站表全部被扫到;--precise 让 WP-CLI 先把字符串反序列化再替换,可以自动修正长度;--skip-columns=guid 跳过文章 GUID,避免被误改。
迁移后必须检查哪些点?
结论:至少要验证子站域名、固定链接、上传文件访问和多站点网络设置这四项,否则会留下“能进后台,但前台 404”的隐患。
- 查
wp_blogs 表的 domain 和 path 字段,每个子站占一行,域名没换全的话子站会跳回旧域名。
- 查
wp_sitemeta 表里的 siteurl,以及各子站的 wp_2_options 中 siteurl、home 两条记录。
- 前台逐个访问子站首页和一篇内页,确认重写规则生效;如果 404,就去“设置 → 固定链接”重新保存一次。
- 打开一篇带图片的文章,确认上传目录路径正确、图片能直接访问。
- 如果用了域名映射插件(
SUNRISE 常量相关),要同步更新 wp_domain_mapping 表。
整个流程建议先在测试环境用 hosts 绑定新服务器 IP,跑通全部子站后再切 DNS,把不可控的停机时间缩短到 DNS 生效的那几分钟。
多站点迁移的难点不在搬文件,而在于网络级表和序列化数据这两处“隐形依赖”。用不用 WP-CLI,决定了这件事是半小时还是三天。