WordPress
在您的 WordPress 数据库中运行搜索和替换
WordPress stores absolute URLs in dozens of database tables, so a domain change or an SSL move leaves old addresses scattered through posts, options and plugin settings: a search and replace is how…
在您的WordPress数据库中运行搜索和替换
WordPress在数十个数据库表中存储绝对URL,因此域名更改或SSL迁移会在文章、选项和插件设置中遗留旧地址:搜索和替换是安全清理它们的方法。本指南介绍了在KPanel中支持的两种做法、为什么一种常见的第三种方法会破坏数据,以及如何验证结果。
何时需要搜索和替换
- 启用SSL后从
http://移至https://。 - 更改域名,例如从
old-brand.co.nz到new-brand.co.nz。 - 将暂存环境推送到生产环境后,暂存主机名仍然存储在数据库中。
- 停用旧资源主机,一次性重新指向所有图像URL。
- 修复许多文章中的批量错误,例如旧电话号码或停用的产品名称。
搜索和替换会一次性改写所有表中的行,且没有按行撤销功能。在开始前每次都要备份,即使看起来是微不足道的更改。当您使用下面介绍的内置工具时,KPanel会自动创建备份,但如果您自己运行命令,则由您负责备份。请参阅备份。
为什么不能仅运行SQL REPLACE
这是WordPress数据库工作中最具破坏性的错误,在选择方法前值得理解。
WordPress将插件设置、主题选项和小工具数据存储为PHP序列化字符串。序列化字符串记录其中每个值的长度,如下所示:
a:1:{s:3:"url";s:26:"http://old-domain.co.nz/x";}
其中s:26表示URL长度为26个字符。使用纯SQL REPLACE()将http://替换为https://,文本变为27个字符,但存储的长度仍然声称是26。PHP随后拒绝反序列化整个选项,该设置以静默方式恢复为空。主题自定义设置消失、滑块失去幻灯片、插件许可证自行注销。
KPanel运行的WP-CLI搜索替换对每个值进行反序列化、在其内部进行替换,并用更正的长度重新序列化。这就是为什么它是这里仅有的记录方法。
永远不要针对WordPress数据库运行UPDATE wp_options SET option_value = REPLACE(...)或在phpMyAdmin中的等效命令。它看起来有效、报告受影响的行,但以静默方式破坏它接触的每个序列化设置。除了恢复备份外,没有修复方法。
方法1:搜索和替换卡片
这对几乎所有人来说都是正确的选择。它在每个WordPress计划中都可用。
- 登录KPanel,单击左侧边栏中的网站。
- 单击该网站。
- 打开WordPress选项卡,然后打开快速操作部分。
- 找到搜索和替换卡片,单击配置。
- 在**查找(旧值)**中输入现有文本。
- 在替换为中输入新文本。
- 保持演练(仅预览,无更改)勾选状态,单击预览。

演练报告将进行多少个替换,并按表和列细分计数,以便在提交前可以看到更改的确切位置。
当预览看起来正确时:
- 取消勾选演练。
- 单击运行。
- 确认对话框。
在替换开始前会自动进行完整备份,运行涵盖所有表,包括由插件创建的表。
搜索尽可能具体的字符串。替换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列。尽管看起来像URL,但它是一个标识符,而不是链接,源阅读器使用它来判断是否已经看过某个项目。改写它会使源中的每篇文章重新显示为新文章。
永久更改域名并重新开始时改写GUID。仅在同一域名上从HTTP移至HTTPS时使用--skip-columns=guid跳过。
更改域名:改用更改网站URL卡片
如果整个目的是将网站移至新域名,请不要从搜索和替换开始。更改网站URL卡片位于同一个快速操作部分,它更新siteurl和home选项,并在一个操作中对所有表运行替换,顺序正确。反过来做可能会导致WordPress无法加载其自己的管理界面。
替换后
在完成前请按此列表工作。
- 清除缓存。 在快速操作部分,运行清除缓存。如果网站使用整页缓存,从WordPress清除,然后从缓存清除。
- 清除重写规则。 在同一部分运行清除重写,或在wp-admin中打开设置,然后打开固定链接,单击保存更改而不做任何更改。
- 清除CDN(如果网站在其上),从性能,然后Kapsule CDN。请参阅清除CDN缓存。
- 在私密窗口中加载网站,以便您的浏览器缓存无法误导您。
- 检查挂锁。 SSL迁移后挂锁缺失或警告意味着URL遗留下来:修复混合内容警告。
- 点击复杂的页面。 主页滑块、标题徽标、任何用页面构建器构建的页面,以及商店上的结账。这些保持存储在序列化选项中的URL。
- 从其自己的设置屏幕清除任何缓存插件。
故障排除
演练报告零个替换。 该字符串在数据库中不存在该确切形式。检查末尾的斜杠、www.前缀或方案。尝试首先仅搜索裸主机名以确认它确实存在。
域名更改后图像损坏。 媒体URL存储在wp_posts和wp_postmeta中,由--all-tables选中,但CDN或图像优化插件可能缓存其自己重写的副本。清除CDN和插件的缓存,然后重新加载。
替换后设置消失。 这是序列化问题,表示更改是用原始SQL而不是通过此处的工具进行的。恢复运行前拍摄的备份:从备份恢复。
暂存URL持续返回。 某些东西正在重新填充它们,通常是计划的推送或缓存的选项。检查使用暂存:推送和拉取中的工作流程,并确保推送时勾选重写URL。