Skip to content

庄朋龙的博客

有志者自有千方万计,无志者只感千难万难。

Menu
  • 首页
  • 生活
  • 创业
  • 编程
  • 运维
  • 视频课程
    • 跨境独立站
    • Shopee跨境电商
    • TEMU跨境电商
  • 资源分享
    • 网站推荐
    • 开源推荐
    • 可商用字体
    • 书籍分享
Menu

使用 WP-CLI 安全高效地批量更换 WordPress 域名​

Posted on 2025年7月9日2025年7月9日 by 庄朋龙

引言:为什么需要 WP-CLI?​​

为 WordPress 网站更换域名是一个常见的需求,无论是品牌升级、SEO 优化还是迁移服务器。传统方法通常依赖 phpMyAdmin 手动执行 SQL 语句来修改数据库中的旧域名记录。然而,这种方法存在几个显著缺点:

  1. ​繁琐且易错:​​ 需要手动定位包含旧域名的多个数据库表(原文提到不止两个,通常是 wp_options, wp_posts, wp_postmeta 等),编写复杂的 UPDATE 语句,极易遗漏或误操作。
  2. ​序列化数据风险:​​ WordPress 存储某些数据(如选项值、文章自定义字段)时使用了 PHP 序列化格式。直接修改这些字段的长度或结构(例如,新旧域名长度不一致)会破坏序列化,导致数据损坏和网站功能异常。
  3. ​权限限制:​​ 在没有服务器直接访问权限的环境下,依赖 phpMyAdmin 可能是唯一选择,但操作风险更高。
  4. ​效率低下:​​ 对于大型站点,手动查找替换极其耗时。

WP-CLI 的优势:​​

WP-CLI (WordPress Command Line Interface) 是 WordPress 官方的命令行工具。它提供了一种强大、精准且相对安全的方式来执行各种 WordPress 管理任务,包括批量域名更换:

  • ​自动化批量处理:​​ 自动扫描整个数据库,查找并替换所有指定字符串(旧域名),无需手动定位每个表。
  • ​智能处理序列化数据:​​ 核心的 search-replace 命令能够检测并正确处理序列化的数据,避免因长度变化导致的破坏。
  • ​更安全可控:​​ 支持 --dry-run 参数进行模拟运行,预览替换结果,确认无误后再实际执行。
  • ​命令行高效性:​​ 特别适合在服务器上直接操作,速度远快于图形界面。
  • ​适用于有服务器访问权限的环境:​​ 如 VPS、云服务器或本地开发环境(Debian, Ubuntu, CentOS 等任意 Linux)。

​本文目标:​​ 指导你如何在拥有服务器 Shell 访问权限(如 Debian, Ubuntu 等 Linux 系统)的环境下,使用 WP-CLI 安全地完成 WordPress 域名的批量更换。

重要前提与风险提示:​​

  1. ​服务器访问权限:​​ 你需要通过 SSH 等方式登录到运行 WordPress 的服务器,并拥有足够的权限(通常是 root 或具有 sudo 权限的用户)。
  2. ​数据库备份:​​ ​在进行任何数据库操作之前,务必进行完整的数据库备份!​​ 这是最重要的安全措施。可以使用 mysqldump命令或你的主机控制面板备份工具。
  3. ​文件备份:​​ 建议同时备份 WordPress 文件目录(包含 wp-config.php, wp-content 等)。
  4. ​理解风险:​​ 命令行操作具有强大威力,但也意味着错误命令可能导致严重后果。请仔细阅读并理解每一步操作。​使用本文方法需自行承担风险。​​

第一步:安装 WP-CLI​

WP-CLI 安装过程简单直接。以下命令适用于大多数 Linux 系统:

下载 WP-CLI Phar 文件:​​

wget -O wp-cli.phar https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
  • wget:下载工具。
  • -O wp-cli.phar:将下载的文件保存为 wp-cli.phar。
  • URL:WP-CLI 官方提供的 Phar 文件地址。

​赋予执行权限:​

chmod +x wp-cli.phar

使下载的文件可执行。

移动到系统路径并重命名(方便全局调用):​

​sudo mv wp-cli.phar /usr/local/bin/wp
  • sudo:需要管理员权限移动文件到系统目录。
  • mv:移动并重命名命令。
  • /usr/local/bin/wp:目标路径,将文件重命名为 wp。这样你在任何目录下只需输入 wp 即可调用。

验证安装:​​

wp --info

运行此命令将输出类似以下的信息,显示 WP-CLI 版本、PHP 环境、MySQL/MariaDB 版本等关键配置。看到类似输出即表示安装成功:

OS: Linux 5.10.0-11-cloud-amd64 #1 SMP Debian 5.10.92-2 (2022-02-28) x86_64
Shell: /usr/sbin/nologin
PHP binary: /usr/bin/php8.1
PHP version: 8.1.3
php.ini used: /etc/php/8.1/cli/php.ini
MySQL binary: /usr/bin/mysql
MySQL version: mysql Ver 15.1 Distrib 10.7.3-MariaDB, for debian-linux-gnu (x86_64) using readline EditLine wrapper
SQL modes:
WP-CLI root dir: phar://wp-cli.phar/vendor/wp-cli/wp-cli
...
WP-CLI version: 2.6.0

第二步:域名更换前的服务器配置准备​

在执行数据库替换操作之前,需要确保新旧域名在服务器层面都已正确配置并生效,以便网站能在新旧域名下暂时同时访问。这是顺利执行替换和后续验证的关键。

  1. ​配置 Web 服务器 (Nginx / Apache):​​
    • ​复制配置:​​ 复制一份当前网站主域名的虚拟主机配置文件,修改其中的 server_name 指令,将旧域名和新域名都包含进去(或者为旧域名单独创建一个新的配置文件)。
    • ​更新 SSL 证书:​​ 确保为新域名配置了有效的 SSL 证书(例如使用 Let’s Encrypt)。​同样重要的是,为旧域名也配置一个有效的 SSL 证书(即使是临时的)。​​ 如果旧域名证书过期或不匹配,在替换过程中通过旧域名访问后台或页面时浏览器会显示安全警告,甚至阻止访问,导致操作失败或验证困难。如果旧域名不再使用,至少保证在替换操作期间它能通过 HTTPS 正常访问。
    • ​重启 Web 服务器:​​ 修改配置后,重启 Nginx (sudo systemctl restart nginx) 或 Apache (sudo systemctl restart apache2) 使新配置生效。
  2. ​验证访问:​​
    • 分别用 https://old.example.com 和 https://new.example.com 访问你的网站。确保两者都能正常打开 WordPress 前台和后台 (/wp-admin),并且没有 SSL 证书错误。

​第三步:核心操作 – 使用 WP-CLI 批量替换域名​

现在,新旧域名都已就绪,可以开始执行数据库替换。

1.定位 WordPress 根目录:​

cd /var/www/example.com # 将 /var/www/example.com 替换为你实际的 WordPress 安装绝对路径

你必须进入包含 wp-config.php, wp-content 等文件和目录的顶层目录。
​2.关键:以正确的用户身份执行命令 – 权限保障!​​

在 Linux 系统中,Web 服务器进程(如 Nginx 或 PHP-FPM)通常以一个特定用户(如 www-data, nginx, apache)运行,WordPress 文件的所有者也应设置为此用户。

使用 sudo -u www-data(请根据你的系统确认实际用户,常见的是 www-data 或 nginx)来运行 wp 命令,确保 WP-CLI 在操作文件和数据库时使用的用户身份与 Web 服务器一致。这能最大程度避免因文件权限问题导致的意外错误。如果文件所有者是其他用户,请替换 www-data 为正确的用户名。

​3.模拟运行 (Dry Run) – 安全预演:​​

sudo -u www-data wp search-replace 'https://old.example.com' 'https://new.example.com' --dry-run
  • wp search-replace:核心命令,执行搜索替换。
  • 'https://old.example.com':要被替换的旧域名完整 URL。​强烈建议包含协议 https:// 或 http://。​​
  • 'https://new.example.com':要替换成的新域名完整 URL。
  • --dry-run:​最重要的安全参数!​​ 它指示 WP-CLI 执行一次模拟运行,找出所有需要替换的地方并计算数量,​但不会对数据库进行任何实际修改。​​
  • ​分析输出:​​ 命令执行后会列出数据库中的所有表(Table)、列(Column)、将被替换的条目数量(Replacements)以及数据类型(Type)。仔细查看这个列表:
    • 关注 Replacements 数量较大的表(如 wp_posts.guid, wp_posts.post_content, wp_options.option_value),这些是域名存储的主要位置。
    • 观察 Type 列:SQL 表示直接字符串替换,PHP 表示 WP-CLI 检测到该字段包含序列化数据,会进行安全处理。
    • ​检查替换总数 (Success: XXXX replacements to be made.) 是否大致符合预期。​​ 如果你网站内容很多,这个数字会很大,主要来自文章内容中的内部链接和 guid 字段。确认没有异常高的数字出现在不该出现的地方(例如用户邮箱字段 wp_users.user_email 替换数应为 0)。

4.实际执行替换:​​
经过 --dry-run 仔细验证确认无误后,移除 --dry-run 参数执行真正的替换:

sudo -u www-data wp search-replace 'https://old.example.com' 'https://new.example.com'
  • 命令格式与模拟运行相同,只是去掉了 --dry-run。
  • 执行后,WP-CLI 会输出实际完成的替换数量:Success: Made XXXX replacements.。这个数字应该与之前模拟运行的结果一致(或在无缓存干扰的情况下非常接近)

重要补充说明与注意事项:​​

  • ​协议处理:​​
    • 如果网站之前没有启用 HTTPS,旧链接使用的是 http://,那么你必须在命令中使用 'http://old.example.com' 作为搜索字符串。WP-CLI 不会自动猜测协议。
    • ​建议执行两次替换:​​ 为了更彻底地迁移,​强烈建议执行两次替换命令:
      1. 第一次:替换完整协议和域名 'https://old.example.com' -> 'https://new.example.com'。
      2. 第二次:替换协议相对路径​ '//old.example.com' -> '//new.example.com'(注意搜索字符串是 两个斜杠开头)。协议相对路径(//example.com/path)在现代网站中也很常见,浏览器会根据当前页面自动使用 http: 或 https:。
    • ​避免直接替换裸域名:​​ 不要轻易尝试 wp search-replace 'old.example.com' 'new.example.com'(不带协议)。虽然看起来更彻底,但风险极高:
      • 可能意外修改数据库中包含该域名的任何文本,例如用户的邮箱地址 ([email protected])、设置项中的特定字符串、主题/插件代码中恰好包含该域名的文本片段(虽然 WP-CLI 主要操作数据库表而非文件,但数据库的 option_value 或 post_content 中可能存储了这类代码)等,导致数据损坏或功能异常。坚持替换完整 URL (http(s)://...) 或协议相对路径 (//...) 是最精准安全的做法。

第四步:其他辅助域名设置方法(通常非必需,但可作为补充)​​

WP-CLI 的 search-replace 是解决旧内容链接问题的根本方法。以下方法主要影响新生成内容的 URL 基础,​不能替代数据库批量替换​:

  1. ​修改 wp-config.php:​​
    在 WordPress 根目录下的 wp-config.php 文件中,在 /* That's all, stop editing! Happy blogging. */ 这行注释之前添加:
define('WP_HOME', 'https://new.example.com');
define('WP_SITEURL', 'https://new.example.com');

//在这行注释之前添加
/* That's all, stop editing! Happy blogging. */
  • 这两行定义强制设置了 WordPress 的主页地址 (WP_HOME) 和核心文件地址 (WP_SITEURL),会覆盖数据库 wp_options 表中的 home 和 siteurl 选项值。
  • ​作用:​​ 确保 WordPress 后台和前端生成的新链接(如菜单、新文章的链接)都基于新域名。​不影响数据库中已存在的旧内容链接(文章内容、附件链接、旧评论链接等)。​​
  • ​与 WP-CLI 的关系:​​ 在完成 WP-CLI 的 search-replace 后,数据库中的 home 和 siteurl 选项值通常已被正确更新为新域名。此时添加这两行定义主要是为了锁定设置,防止后台误改,或者在特殊缓存/配置环境下提供双重保障。它不是数据库替换的替代品。
  1. ​修改 WordPress 后台设置:​​
    登录到 WordPress 后台 (https://new.example.com/wp-admin),导航到 设置 -> 常规。修改以下两个字段:
    • WordPress 地址 (URL) (WordPress Address (URL)):对应 siteurl。
    • 站点地址 (URL) (Site Address (URL)):对应 home。
      将两者都改为 https://new.example.com 并保存。
    • ​作用:​​ 与修改 wp-config.php 中的常量作用相同,修改的是数据库 wp_options 表中的 siteurl 和 home 记录。同样只影响新生成内容的 URL 基础,对数据库中大量现存的旧内容链接无效。​​

​重申:方法 3 和 4 对于解决文章内容、附件 guid、评论链接等历史数据中的旧域名问题几乎无效。wp search-replace 才是彻底解决之道。​

​第五步:收尾工作与重定向​

​Nginx 配置示例 (在旧域名的 server 块中):​​

​清除缓存:​​ 如果你使用了任何缓存插件(如 W3 Total Cache, WP Super Cache)、对象缓存(如 Redis, Memcached)或 CDN 服务(如 Cloudflare),​务必在替换完成后清除所有缓存。登录插件后台、CDN 控制台或使用相关命令清除缓存,让新域名的内容生效。

​更新 Nginx/Apache 配置 – 旧域名重定向:​​

现在新旧域名都指向新内容了。为了 SEO 和用户体验,需要将旧域名的所有访问永久重定向 (301 Redirect)​​ 到新域名对应的地址。

server {
    listen 80;
    listen 443 ssl;  # 如果旧域名有 HTTPS,也需监听 443
    server_name old.example.com;
    ssl_certificate ...;  # 旧域名的证书路径(如果配置了 HTTPS)
    ssl_certificate_key ...;

    # 强制 HTTPS 重定向(如果需要,可选)
    # if ($scheme != "https") {
    #    return 301 https://$host$request_uri;
    # }

    # 核心:301 重定向到新域名,保留原始请求路径和参数
    return 301 https://new.example.com$request_uri;
}

​Apache 配置示例 (在 .htaccess 或虚拟主机配置中):​​

RewriteEngine On
# 匹配旧域名(忽略大小写)
RewriteCond %{HTTP_HOST} ^old\.example\.com$ [NC]
# 永久重定向到新域名,保留路径
RewriteRule ^(.*)$ https://new.example.com/$1 [R=301,L]
  • 保存并重启 Web 服务器:​​ sudo systemctl restart nginx 或 sudo systemctl restart apache2。
  • ​测试重定向:​​ 访问 https://old.example.com/some-page,应该立即跳转到 https://new.example.com/some-page,并且浏览器地址栏显示新 URL,状态码为 301。

第六步:全面验证​

  1. ​访问新域名:​​ 确保 https://new.example.com 网站前台和后台 (/wp-admin) 完全正常。
  2. ​检查内容:​​ 随机打开一些旧文章、页面、附件,检查图片、内部链接是否都指向新域名。
  3. ​检查后台设置:​​ 确认 设置 -> 常规 中的两个 URL 地址已更新为新域名(除非你用 wp-config.php 常量锁定了)。
  4. ​测试表单和功能:​​ 测试评论提交、联系表单、用户登录/注册、购物流程(如果是电商站)等关键功能是否正常工作。
  5. ​检查旧域名重定向:​​ 如前所述,确保 https://old.example.com/any-path 正确 301 跳转到 https://new.example.com/any-path。
  6. ​更新外部服务:​​ 记得在 Google Search Console、Bing Webmaster Tools、Google Analytics、社交媒体链接、邮件服务商设置等地方更新你的网站域名。

​总结​

使用 WP-CLI 的 wp search-replace 命令是批量更换 WordPress 域名最强大、高效且相对安全的方法。它彻底解决了传统 SQL 替换的繁琐和序列化数据风险。关键在于:

  1. ​提前准备:​​ 备份!配置好新旧域名的 Web 访问和 HTTPS。
  2. ​安全预演:​​ ​务必使用 --dry-run 模拟运行并仔细核对结果。
  3. ​精准替换:​​ 优先替换带协议 (https?://) 或协议相对 (//) 的完整 URL,避免裸域名替换。
  4. ​正确执行:​​ 使用 sudo -u www-data (或对应 Web 用户) 执行命令。
  5. ​彻底收尾:​​ 设置 301 重定向,清除缓存,全面测试。

遵循本指南,你可以自信地完成 WordPress 域名的迁移工作。对于多站点网络 (wp multisite),WP-CLI 的 search-replace 同样适用,但需要注意额外的参数(如 --url 指定具体站点)和更复杂的配置迁移。

Category: 编程

全栈开发者×创业偏执狂

相信代码能改变命运,也相信凌晨四点的服务器警报里有真实的人生。

我的创业项目:
SHOPAGG / SmallShop / DigitShops / 文硕阁

© 2025 庄朋龙的博客