跳至正文
目录
WordPress

在 WordPress 数据库中执行搜索替换

此内容为机器翻译,如需查阅原文请查看英语版本。

WordPress 会在数十个数据库表中存储绝对网址,因此更换域名或迁移到 SSL 后,旧地址会散落在文章、选项和插件设置中:搜索替换就是安全清理它们的方法。本指南介绍在 KPanel 中执行此操作的两种受支持方式、为什么一种常见的第三种方法会损坏数据,以及如何验证结果。

何时需要执行搜索替换

  • 启用 SSL 后从 http:// 迁移到 https://。
  • 更换域名,例如从 old-brand.co.nz 更换为 new-brand.co.nz。
  • 将预发布环境推送到生产环境后,预发布主机名仍然固化在数据库中。
  • 停用旧的资源主机,并一次性将所有图片网址重新指向新地址。
  • 批量修正多篇文章中的同一处错误,例如旧电话号码或已停产的产品名称。

搜索替换会一次性改写所有表中的行,并且无法按行撤销。每次开始之前都请先创建备份,即使是看起来微不足道的更改也不例外。当您使用下文所述的内置工具时,KPanel 会自动创建一份备份,但如果您自己运行命令,备份就需要由您负责。请参阅创建备份。

为什么不能直接运行 SQL REPLACE

这是 WordPress 数据库操作中破坏性最大的错误,因此在选择方法之前值得先了解清楚。

WordPress 将插件设置、主题选项和小工具数据存储为 PHP 序列化字符串。序列化字符串会记录其中每个值的长度,例如:

a:1:{s:3:"url";s:26:"http://old-domain.co.nz/x";}

其中的 s:26 表示该网址长度为 26 个字符。如果使用普通的 SQL REPLACE() 将 http:// 替换为 https://,文本就会变成 27 个字符,而存储的长度仍然声称是 26。PHP 随后会拒绝反序列化整个选项,该设置会悄无声息地恢复为空。主题自定义设置会消失,幻灯片会丢失其中的幻灯片,插件许可证会自行注销。

KPanel 运行的 WP-CLI search-replace 会对每个值进行反序列化,在其中执行替换,然后以修正后的长度重新序列化。这就是本文只介绍这种方法的原因。

切勿对 WordPress 数据库运行 UPDATE wp_options SET option_value = REPLACE(...) 或在 phpMyAdmin 中执行等效操作。它看起来像是成功了,也会报告受影响的行数,但会悄悄破坏它触及的每一个序列化设置。除了还原备份之外,没有任何修复方法。

方法 1:搜索替换卡片

这几乎适合所有人。所有 WordPress 套餐均可使用。

  1. 登录 KPanel,然后点击左侧边栏中的网站。
  2. 点击该网站。
  3. 打开 WordPress 标签页,然后进入快捷操作部分。
  4. 找到搜索和替换卡片,然后点击配置。
  5. 在查找(旧值)中输入现有文本。
  6. 在替换为中输入新文本。
  7. 保持勾选试运行(仅预览,不做更改),然后点击预览。

KPanel 快捷操作中的搜索和替换卡片

试运行会报告将进行多少次替换,并按表和列细分计数,因此您可以在正式执行之前准确看到更改将落在哪里。

当预览结果无误时:

  1. 取消勾选试运行。
  2. 点击运行。
  3. 在对话框中确认。

替换开始之前会自动创建一份完整备份,并且本次运行涵盖所有表,包括由插件创建的表。

请搜索尽可能具体的字符串。替换 old-domain.co.nz 时,也会同时改写 mail.old-domain.co.nz 和 staging.old-domain.co.nz,而这通常不是您想要的。包含协议部分(如 https://old-domain.co.nz)可以让匹配更精确。

方法 2:从控制台使用 WP-CLI

控制台为您提供相同的引擎,并可对参数进行更多控制。它是托管套餐中出现的部分之一;在其他套餐中,标签栏会显示一个托管套餐 +8 项链接。

打开该网站,然后依次进入 WordPress、控制台。提示符已经以 wp 开头,因此只需输入命令的其余部分。

先预览:

search-replace 'http://old-domain.co.nz' 'https://old-domain.co.nz' --all-tables --dry-run

然后正式运行:

search-replace 'http://old-domain.co.nz' 'https://old-domain.co.nz' --all-tables

控制台不会为您创建备份。只有在使用方法 1 中的搜索和替换卡片时,才会在运行前自动创建备份。如果您在这里运行命令,请先在网站的备份页面中自行创建一份备份。

常用参数:

参数作用
--all-tables包括由插件创建的自定义表,而不仅仅是 WordPress 核心表
--dry-run报告将会更改的内容,但不写入任何数据
--precise使用 PHP 而不是 SQL 执行替换。速度较慢,但能处理棘手的序列化结构
--skip-columns=guid不改动文章的 GUID(见下文)
--report-changed-only将输出精简为实际发生更改的表

关于 GUID 的说明

每篇 WordPress 文章都有一个 guid 列。尽管它看起来像一个网址,但它是一个标识符,而不是链接,订阅源阅读器用它来判断是否已经见过某个条目。改写它可能会让订阅源中的每篇文章都重新显示为新文章。

当您永久更换域名并重新开始时,请改写 GUID。当您只是在同一域名上从 HTTP 迁移到 HTTPS 时,请使用 --skip-columns=guid 跳过它们。

更换域名:请改用网站网址卡片

如果您的目的就是将网站迁移到新域名,请不要从搜索替换开始。同一快捷操作部分中的更改网站网址卡片会更新 siteurl 和 home 选项,并在一次操作中按正确的顺序在所有表中执行替换。如果顺序反过来,可能会导致 WordPress 无法加载自己的管理后台。

替换完成后

在宣告完成之前,请逐项完成以下清单。

  1. 清除缓存。 在快捷操作部分中运行清除缓存。如果网站使用全页缓存,请在 WordPress 下的缓存中清除它。
  2. 刷新重写规则。 在同一部分中运行刷新重写规则,或在 wp-admin 中依次打开设置、固定链接,不做任何更改直接点击保存更改。
  3. 如果网站使用了 CDN,请在性能下的 Kapsule CDN 中清除 CDN 缓存。请参阅清除 Kapsule CDN 缓存。
  4. 在隐私窗口中加载网站,以免浏览器缓存误导您。
  5. 检查挂锁图标。 迁移到 SSL 后如果挂锁缺失或显示警告,说明仍有网址未被替换:请参阅修复混合内容警告。
  6. 逐一点击检查容易出问题的页面。 首页幻灯片、页眉标志、任何使用页面构建器搭建的页面,以及商店的结账页面。这些地方保存着位于序列化选项中的网址。
  7. 在任何缓存插件自己的设置页面中清除其缓存。

故障排除

试运行报告零次替换。 数据库中不存在完全相同形式的该字符串。请检查末尾的斜杠、www. 前缀或协议部分。可以先只搜索不带其他部分的主机名,确认它确实存在。

更换域名后图片无法显示。 媒体网址位于 wp_posts 和 wp_postmeta 中,会被 --all-tables 覆盖,但 CDN 或图片优化插件可能缓存了自己改写过的副本。请清除 CDN 和该插件的缓存,然后重新加载。

替换后设置消失了。 这就是序列化问题,说明更改是用原始 SQL 而不是通过此处介绍的工具完成的。请还原运行前创建的备份:从备份还原。

预发布网址不断重新出现。 有某些东西在重新填充它们,通常是计划推送或缓存的选项。请查看使用预发布环境:推送与拉取中的工作流程,并确保推送时勾选了改写网址。

这对您有帮助吗?

您是 AI 吗?以 Markdown 格式阅读本页

相关文章

安装 WordPressWordPress是全球使用最广泛的建站平台,KapsuleHost让安装过程实现了自动化。本指南将介绍两种安装方式、如何管理您的登录凭据、如何访问管理面板,以及全新安装完成后应采取的…WordPress:从何处开始KapsuleHost 为 WordPress 网站做了什么、哪些工作仍需您自己完成,以及每项工作应阅读哪份指南。 WordPress 支撑着大半个互联网,也是大多数 KapsuleHost 网站的默认选择。…WordPress 自动更新Auto-updates 让 WordPress 核心、插件和主题保持最新,而无需您留意发布说明,并且这一过程是安全的:每次更新前都会进行完整备份,更新后会检查网站,任何破坏网站的情况都会被…WooCommerce 商店的支付网关支付网关标签页列出了您的WooCommerce商店可用的支付网关,显示哪些已安装、哪些已启用,并提供一键安装和启用功能,让您的商店从无结账功能在几分钟内变为可以接受银行卡支付。…

仍未解决?

询问了解您账户的 Kora,或联系我们的团队。

联系我们发送邮件