问题描述
我在我们的开发机器上在 WordPress 中创建了一个网站。在我们使用的主题中,有许多小工具区域可以在 (侧边栏和首页) 中显示文本。我在所有这些区域中使用了简单的文本小工具来显示我们的显示信息。
当我将网站迁移到生产时,我使用 WP-DB-Backup 插件来获取数据库的快照。然后我编辑生成的.sql 文件,以更新所有文件路径和 URL 引用来指向我们的生产站点。
创建数据库,网站,并将所有文件复制到生产站点后,我从 mysql 命令提示符运行.sql 文件,将数据导入到新的数据库。
但是,当我去生产现场时,有些文字显示出来,其中一些没有。当我查看网站的小工具部分时,文本小工具在一些小工具区域中丢失。文本窗口小工具在 「非活动窗口小工具」 区域中甚至不可见,它们根本就不存在。
我甚至尝试使用 BackWPup 插件来重复该过程,注意到当它将数据库转储出来时,SQL 语法不同。
为什么在导入期间丢失文本小工具数据?
最佳解决方案
这是你的问题所在:
I then edited the resulting .sql file
to update all of the file paths and
URL references to point to our
production site.
你不能这样做 WordPress 存储许多选项作为 「序列化数据」,其中包含字符串内容和它们的长度。因此,当您修改 URL 和长度更改时,序列化数据将不再正确,PHP 会拒绝它。
长期的问题是,基本上你错了。如果您正在设置一个将其数据迁移的开发站点,那么它应该具有与生产站点完全相同的 URL 。您可以手动编辑您的 HOSTS 文件,以使该生产域 (例如 example.com) 具有不同的 IP 地址 (如 127.0.0.1),因此”production” URL 将成为开发站点。然后,您可以使用该生产 URL 创建数据和链接以及其他所有内容,并且迁移数据时,不得更改任何内容。
但是在短期内,不要在 SQL 文件上使用简单的文本搜索/替换。正如你所发现的那样,这会打破事情。
而我犹豫建议它,有一种办法来改变 WordPress 核心代码来处理这些破碎的序列化。您必须修改 wp-includes / functions.php 文件,并将 maybe_unserialize() 函数更改为:
function maybe_unserialize( $original ) {
if ( is_serialized( $original ) ) {
$fixed = preg_replace_callback(
'!(?<=^|;)s:(d+)(?=:"(.*?)";(?:}|a:|s:|b:|i:|o:|N;))!s',
'serialize_fix_callback',
$original );
return @unserialize( $fixed );
}
return $original;
}
function serialize_fix_callback($match) { return 's:' . strlen($match[2]); }
这不是一个可行的长期解决方案。它应该只能用来让你和现在工作。从长远来看,您需要修复您的开发过程,以便您不必开始这样的网址。
次佳解决方案
为了处理这个问题我一直使用 WordPress 序列化搜索& 更换此处提供的工具。没有任何问题,它的工作完全正常。我一直在使用这个很长一段时间,我的所有网站迁移要求。这真的照顾了将开发数据库迁移到生产的问题。
https://interconnectit.com/products/search-and-replace-for-wordpress-databases/
第三种解决方案
奥托的答案是 spot-on 。我也发现了这个难题。
但是,我设法使用 http://spectacu.la/search-and-replace-for-wordpress-databases/的酷脚本来解决这个问题
要迁移您的 wordpress 和新的 URL /域名,请执行以下操作:
- 使用现有 wordpress 的 DB 转储 (例如使用 phpmyadmin)
- 恢复转储 as-is(不需要修改) 到您的新位置
- 将脚本从 spectacu.la 解压缩到您的 wordpress 主文件夹 (它不是插件…)
- 通过将浏览器指向您的新站点来运行脚本,例如 http://new-website.url/searchreplacedb.php
- 不要忘记从你的新 wordpress 家中删除脚本
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。