修改包含 URL 的序列化数据字符串
这是添加到@Daniel anwser 并警告在 SQL 转储上进行简单查找和替换的危险。数据库中存储了很多序列化数据,URL也存储在序列化数据字符串中,尤其是菜单和图像轮播以及很多插件设置。
如果您想对 SQL 转储进行正确的查找和替换,则必须更新序列化数据中的 URL 字符串长度属性。
我个人使用 Git pre-commit 和 post-receive 钩子来自动执行这些繁琐且容易出错的任务,并大量使用 perl 正则表达式在钩子内完成此任务。
但是您可以通过 shell 脚本和使用 Perl regexp 来做同样的事情。
这是一个查找替换例程,在许多 Wordpress 站点迁移中对我来说效果很好。它使用 Perl 单行代码。请注意,Perl 默认安装在所有或大多数 linux 发行版以及 MacOsX 上。
您还必须对插件生成的 javascript 文件和 json 清单文件执行查找替换例程,否则您的网站可能会中断。
建议先使用测试站点进行所有修改,而不是在生产站点上。 Wordpress 网站很容易崩溃,有时即使是经验丰富的开发人员也需要一段时间才能找到罪魁祸首。
这是一个可以运行的 shell 脚本示例。定义您自己的变量和 shell 路径。它通过 2 次传递进行更智能的查找和替换,并更改序列化数据字符串中的 URL 长度属性。
(显然“子域”、“域”和“tld”必须与你的相对应。)
#!/bin/bash -e
# Database info
DBHOST=localhost
DBUSER=mydbusername
DBPASS=mypasswd
DBNAME=mydbname
# Location of SQL dumps
SQL_DUMP_FILE=/path-to-your-sql-dump/dump.sql
MODIFIED_SQL_DUMP_FILE=/path-to-your-modified-sql-dump/dump.sql
# Create original dump file
mysqldump -h $DBHOST -u $DBUSER -p$DBPASS $DBNAME --skip-extended-insert --skip-dump-date --single-transaction > $SQL_DUMP_FILE
# First pass: find and replace subdomain to subdir, keep original dump and generate new modified file
perl -pe 's/subdomain\.domain\.tld/domain\.tld\/subdirectory/g' < $SQL_DUMP_FILE > $MODIFIED_SQL_DUMP_FILE
# Second pass: Edit serialised data by changing string length parameters when URL detected
perl -i -pe 's{s:(\d+):\\"(http(?:s)*://domain.tld.+?)\\"}{"s:".length($2).":\\\"$2\\\""}ge' $MODIFIED_SQL_DUMP_FILE
完成上述操作后,您可以使用新的 SQL 转储文件在测试站点上构建数据库,该测试站点使用与 find-replace 脚本中定义的域和子目录结构相同的域和子目录结构。
注意:在 shell 脚本中写入数据库密码被认为是不安全的,但由于您无论如何都在 wp-config.php 文件中执行此操作,因此它已经暴露给任何对您的非公共文件具有读取权限的人.
在不同的 shell 脚本或相同的脚本中,您可以执行以下操作:
# Restore or populate new database
mysql --protocol=TCP --port=my-port-number --host=$DBHOST --user=$DBUSER --password=$DBPASS mydatabasename < \
$MODIFIED_SQL_DUMP_FILE