这个源于历史遗留问题,几年前就在本地搭建了博客,并写了一段时间,去年又在线上重新来过写了一段时间,内容本身不重要一开始没打算合并的,但觉得这个知识点还是有必要学习一下,特别是尝试了wordpress自带的导入导出工具插件后,实在忍不住要解决这个问题。
通过官方的导入导出工具,媒体部分总是导入失败,于是直接将wp-content\uploads文件夹传到服务器,可是媒体页面不显示,即时导入成功好像也不显示,真是让人难受,必须拿下。
特别强调:数据备份,操作前一定要备份。
首先要了解wordpress数据库及各表的结构,可参照官方文档:
https://codex.wordpress.org/zh-cn:%E6%95%B0%E6%8D%AE%E5%BA%93%E6%8F%8F%E8%BF%B0
因为现在访问官网及其不稳定,可以自行搜索。而且官方文档好像没怎么更新一样,截个图如下:
再截图现在的数据库对比一下,大概一致有一些小出入,如下:
可以一一打开看一下,我觉得涉及到重要数据的几个表就是posts、postmeta、terms、term_taxonomy、term_relationships,省略了表前缀,这几个表直接都是互相依赖的,根据名字就可以看个大概。post是文章及媒体相关的,term是文章分类、标签等,必须一一对应。
然后就是分析这几个表,如何将他们合二为一,新数据库里面已经存在一部分数据,所以不能直接导入进去,直接导入要么被完全覆盖,要么追加更新。
- 完全覆盖肯定是不行,失去意义了。
- 追加更新为什么也不行,是因为追加是随机的,数据是进去了,但之前说过几个表直接是依赖的,如果id不对应,就会乱套,照样不会解决问题。
大概思路就是这样,首先导入文章及媒体库,post两个表。
- 首先posts表中的id是关键,由它关联到postmeta表,形成对应;
- 将posts表通过navicat导出向导导出excel数据;
- 默认选择全部字段,下一步(不截图了)
- 选中“包含列的标题”和“追加”
- “遇到错误时继续”可以默认选中,我一般不选,没有出错才是最完整的数据。
- 然后打开这个表,将第一列id号统一加一个数字,这个数字必须大于新数据库(被导入)中posts表中的id,并且请记住这个数字,后面还有用的哦。
- 通过同样的方法,导出数据表postmeta,这个表中的meta_id不需要删除掉,导出时可以不选中,或者导出后删除excel文件中的对应列,同样的,文件中的pos_id列统一加入之前的数字,必须一样才能对应。
- 将导出并修改好的wp_posts.xlsx及wp_postmeta.xlsx两个文件导入到新数据库。
- 新数据库选中对应表,执行导入向导,导入类型excel文件;
- 选中对应的excel文件源,全选表,默认四个下一步,导入模式默认追加,下一步,开始,完成。
- 同样的方法执行两次导入,两个表的数据就被合并到新的数据库了。
此时,在新的网站后台打开媒体页面及所有文章页面就可以看到媒体及文章都显示出来了,特别是媒体页面显示正常了最为直观。这算是最重要的两个数据表。
接下来同样的方法,导出及导入term相关三个表,只是三个表中的依赖关系也一定要正确了。
- terms表中的id最为关键,也是统一增加一个数字,同样这个数字同样大于新数据库中terms的id。
- terms表中增加后的id与term_taxonomy中增加后的term_id一样,才能一一对应;
- term_relationships表中的term_taxonomy_id与前表中的term_id及id对应。
- term_relationships表中的第一列object_id与posts中的id不一定对应,但修改时增加的数字必须一样。
归纳一下关键,旧数据库导出的数据要修改的部分:
- _posts.xlsx文件中的id += 1000(假设的固定数字,新表中的id最大值,可以大不能小)
- _postmeta.xlsx文件中的post_id += 1000,删掉meta_id列。
- _terms.xlsx文件中的term_id += 88(假设的第二个固定数字,同样与新表对应,只能大不能小)
- _term_taxonomy.xlsx中的term_taxonomy_id = (term_id += 88)
- _term_relationships.xlsx文件中term_taxonomy_id += 88;object_id += 1000
大概就是这样了,完美导入所有数据。对于数据只要仔细一点,还是很容易解决的。
扩展,在数据中直接批量修改id语句:
UPDATE table_name SET id = id +1000
补充:
1、04-30,发现老文章特色图片有问题,匹配不上,大概看了下可能与postmeta表有关,因为当时正好也忽略了meta_ID,但因为过了一段时间了,不想再测试了,手动修改一下好了。
发表回复