抬头仰望星空,是否能发现自己的渺小。

伪斜杠青年

人们总是混淆了欲望和理想

记一次 WordPress 迁移,或者说是清理过程

这个博客经历过两次合并,以前用的很笨拙的方式,修修补补整了挺多坑,以及主题/插件换来换去数据库产生了很多冗余字段,一直想找个简单有效的方式来清理数据库,所以在周末做了挺多调研和尝试,最后在昨晚成功完成所有迁移事宜。

先说结果:

  1. 数据库减少了 695 行冗余数据,数据库缩小近 2 m
  2. 备份文件减少了大概 80m

经过对比发现,数据的缩减主要是来自 options 表,备份文件的减少主要是来自缩略图的减少。

下面来解释原因:

  1. options 表存放的一般是主题/插件的配置字段,在删除插件/更换主题的过程中并不会清除之前写入的数据,所以 options 表会不断的累积。
  2. 每个 WordPress 主题都有自己的一套缩略图裁剪规格,以便适应主题的不同尺寸下的显示适配问题,在文章的书写过程中,在主题不断更换的前提下,一张图可能产生了十几种不同尺寸的缩略图。迁移后会重新生成当前主题需要的缩略图尺寸能去除大量的无用缩略图。

接下来说主要的解决手段:

WordPress 后台自带的【工具】->【导出】->【导出所有内容】以及 【导入】->【勾选下载附件到本地】

主要的技术实现方案:Docker(WordPress-fpm + nginx)

  1. 一个单独的 WordPress 环境,导入现在站点的所有数据,使其可访问。
  2. 一个全新的 WordPress 环境,走完安装环节,安装 WordPress 导入插件。

之所以将环境搬到本地的原因是,本地数据传输快。

需要注意一些点:

  1. 导入 xml 时提示的一些比如文件内容中格式错误或者没有结尾符导致导入直接失败的。
  2. docker 中两个容器可以 ping 但无法互相 curl,会导致附件无法导入到新站点。
  3. 对于新旧环境都在本地时,由于 源地址 ip 相同,WordPress 将会提示 URL 无效导致附件无法下载。
  4. nginx 防盗链导致的内容无法下载问题。
  5. 因为导入时间过长,页面白屏无响应,没有结果回执,附件未下载完等问题。
  6. 导入后 WordPress 后台提示严重错误或者直接崩溃的。

解决办法:

  1. 用 VS Code 将 xml 文件跳转到第一个报错的那行,不出意外会发现一些红色的莫名其妙的特殊字符,根据内容将其替换为空格或者删除即可。
  2. 将旧站点部署时暴露到主机(检测是否成功办法就是:访问 localhost 看是否能正常访问旧站点),然后将旧站点导出的 xml 中的域名地址或者 ip 地址改为:docker.for.mac.localhost
  3. 在新站点的当前主题的 functions.php 末尾添加内容:add_filter( 'http_request_host_is_external', '__return_true' );
  4. 关闭 nginx 防盗链配置。
  5. 将 nginx 所有 timeout 加上四个0,比如30s 改成 300000s,我的博客资源大概 600m,测试成功。
  6. 请检查数据库表结构是否正常。推荐使用 phpMyAdmin,因为 phpMyAdmin 在表状态错误时,将会让该表处于不可编辑状态,自行尝试修正 sql 后重新导入。常见比如:外键约束错误问题、表错误导致的自增主键重复多 0 状态问题(自行将主键为 0 的条目 sql 按自增状态修正,这一步最好自己写程序操作)。

Nginx 涉及字段:

#proxy
proxy_connect_timeout 3000000s;
proxy_send_timeout 9000000;
proxy_read_timeout 9000000;

#keepalive
keepalive_timeout 120000;

#fastcgi
fastcgi_connect_timeout 3000000;
fastcgi_send_timeout 3000000;
fastcgi_read_timeout 3000000;

最后,将新站点上的数据库导出,并替换掉数据库中本地域名改为线上域名,同时将本地的文件也一同替换到线上站点即可(插件需要重新一个个配置),谨慎一点的话还可以用文件对比工具对比都少了哪些文件以避免小部分未导入的非图片附件缺失

如果具备一定的计算机基础想必都容易理解,不然 docker 也玩不起来,服务器备份越来越大,能少配图就少配图,方便维护。

其他优化:

不同主题有不同的文章自定义字段,可在写文章页面的添加自定义字段处查看,将这些字段使用文件内容搜索的方式去当前主题搜索,如果不存在使用则可以删除,删除的 sql 语句为:

DELETE FROM xx_postmeta WHERE meta_key ='XXXX';

注:xx 为表名前缀,默认为 wp。XXXX 需替换为需要删除的自定义字段。

以上。


本站由以下主机服务商提供服务支持:

0条评论

发表评论