Zblog转WordPress详细方法

      发布在:瞎忙      评论:0 条评论

Zblog和WordPress做博客各有优劣,少不了各种原因需要相互移植内容,最近有这样的需求。WordPress转Zblog有相关插件,网上Zblog转Wordpress的教程大部分是多年前的,相关插件也不知道还能不能用。今天整理下ZblogPHP转WordPress的详细完整方法,考虑到网站改版对seo影响,如非必要还是不要随意改动的好。

直接通过sql语句修改数据库MySQL

操作前先要搞清楚两数据库表和字段的关系,这里有博主总结的《WordPress 数据库结构及表字段作用解析》非常清晰。


1. 将WordPress数据库相关表结构复制到Zblog数据库中

将Zblog数据库备份导出在本地修改,首先在本地建好Wordpress、Zblog数据库,并将Zblog的数据导入进来,我们主要是将分类、标签、文章内容、评论转换到Wordpress对应表中,先将WordPress中的相关表结构复制到Zblog中修改,注意不要复制数据,这里把wp_posts(文章内容)、wp_terms(分类/标签名)、wp_term_taxonomy(分类/标签对应描述、结构、文章数量)、wp_term_relationships(分类/标签与文章的对应关系)、wp_comments(评论)等表结构复制到Zblog数据库中。

Zblog转WordPress详细方法

2. 先转文章正文、标题等相关数据

然后通过sql语句在sql编辑器里操作Zblog数据库,把Zblog相关字段的数据直接添加的WordPress相应空字段中,这里先拿wp_posts这个表说明,表中这几个字段ID,post_title(文章标题)、post_content(正文)、post_excerpt(摘要)、post_date(日期),对应Zblog中zb_post表的log_ID、log_Title、log_Content、log_Intro、log_PostTime,我们可以用INSERT INTO SELECT语句复制数据,这里要注意的是Zblog中log_PostTime数据是时间戳,复制的时候要转一下,具体写法如下(字段顺序对应即可):

INSERT INTO wp_posts(ID,post_title,post_content,post_excerpt,post_date)
SELECT log_ID,log_Title,log_Content,log_Intro,FROM_UNIXTIME(log_PostTime,'%Y-%m-%d %H:%i:%s') FROM zbp_post
Zblog转WordPress详细方法

3. 建立好文章分类和文章对应关系

Zblog中分类相关数据存在zbp_category表中了,通过文章表zbp_post中字段log_cateID与分类字段cate_ID建立对应关系,而WordPress中文章分类要跨两个表,并且另外一个单独的表记录文章与分类的关系,标签也是这样的机制,且是跟文章分类存在相同的表中,甚至导航也存在里面。Zblog中标签表跟文章分类表是存在不同表中的,也是在zbp_post表中记录与文章的对应关系,后面再细说。要把分类/标签转过来,需先搞清楚WordPress中wp_terms、wp_term_taxonomy、wp_term_relationships这三个表的作用。

Zblog转WordPress详细方法

图中分别是wp_terms、wp_term_taxonomy、wp_term_relationships这三个表的字段,这三个表把WordPress分类、标签、链接分类目录、自定义菜单等都存在里面了。


wp_terms存储分别类/标签ID、名称、别名等
term_id:分类/标签ID (主索引)
name:分类/标名
slug:别名

wp_term_taxonomy存储分类/标签描述、父子级关系、所属文章数量,以及与wp_terms表的对应关系
term_taxonomy_id:自身ID (主索引)
term_id:分类/标签ID
taxonomy:归属(category/post_tag)
description:分类/标签描述
parent:所属父分类 ID
count:文章数统计

wp_term_relationships主要存储分类/标签等与各文章、页面的对应关系
object_id:对应文章/标签/链接ID
term_taxonomy_id:wp_term_taxonomy表中数据ID


wp_terms和wp_term_taxonomy表通过term_id字段建立对应关系,wp_term_taxonomy和wp_term_relationships表通过term_taxonomy_id字段建立对应关系。因为文章与标签存在相同的表中并且还是存在两个表中,wp_term_relationships表存储文章与分类/标签的对应关系的时候不会像Zblog那样一篇文章的ID对应的标签ID中一次记录多条数据,一对多,object_id字段和term_taxonomy_id字段是一对一的(举个例子:一篇id为10的文章对应三个标签话,object_id中至少有三行10来分别对应这三个标签),因为WordPress这样的机制,在转分类和标签的时候要特别注意,了解这些后,我们就先把文章分类转存了。

先把文章转到Zblog分类表zbp_category字段分别添加到Wordpress表wp_terms和表wp_term_taxonomy中:

INSERT INTO wp_terms(term_id,name,slug)
SELECT cate_ID,cate_Name,cate_Alias FROM zbp_category
INSERT INTO wp_term_taxonomy(term_id,description,parent,count)
SELECT cate_ID,cate_Intro,cate_ParentID,cate_Count FROM zbp_category

修改taxonomy字段,把转入数据设置为文章分类category:

UPDATE wp_term_taxonomy SET taxonomy='category'

建立分类与文章的对应关系(这里只说明一篇文章对应一个分类,一对多话可参考后面标签的转法):

INSERT INTO wp_term_relationships(object_id,term_taxonomy_id)
SELECT log_ID,log_CateID FROM zbp_post

4. 重点说明标签与文章对应关系的建立

前面我们说过WordPress标签数据存储方式与Zblog的不同,Zblog表zbp_post中一个文章ID会对应多个标签log_Tag字段,并且由大括号“{}”分别包裹着,如下图:

Zblog转WordPress详细方法

需要我们把一行有多个数据的拆分成多行,并把括号“{}”去掉,同时删除无标签的空行,然后添加的到WordPress相应表里,效果如下:

Zblog转WordPress详细方法

建立文章与标签对应关系前,我们先把标签在WordPress建好,还是像建立分类那样把响应数据复制过去,不过这里要说明下,WordPress标签与分类存在相同表中,字段term_id和term_taxonomy_id分类和标签肯定不会相同,所以复制的时候我们要把Zblog标签表zbp_Tag中字段tag_ID自增分类的数量后再复制到WordPress对应表中,这里如果有18个分类的话:

INSERT INTO wp_terms(term_id,name,slug)
SELECT tag_ID+18,tag_Name,tag_Alias FROM zbp_Tag
INSERT INTO wp_term_taxonomy(term_taxonomy_id,term_id,description,count)
SELECT tag_ID+18,tag_ID+18,tag_Intro,tag_Count FROM zbp_tag

修改taxonomy字段,把新转入的数据设置为文章标签post_tag:

UPDATE  wp_term_taxonomy SET taxonomy =  'post_tag' WHERE taxonomy = ''

接下来我们把标签与文章的对应关系建立好,首先把log_Tag里的数据以“}”为分隔符拆分为多行,同时在log_ID添加相应字段搜索出来然后导出,有网友是这样写的:

SELECT
 a.log_ID,
 substring_index( substring_index( a.log_Tag, '}', b.help_topic_id + 1 ), '}', - 1 ) AS log_Tag FROM zbp_post a
JOIN mysql.help_topic b ON b.help_topic_id < ( length( a.log_Tag ) - length( REPLACE( a.log_Tag, '}', '' ) ) + 1 ) ORDER BY a.log_ID

这里需要说明一下,这样写拆分后会多出来空行,不过后面反正还要删除原来log_Tag为空行,如果以“}{”为分割符的话,最后一个数据会多出重复一行,这里就深究了

再复制个zbp_post表结构把刚导出的数据导入到复制的空表中,删除多余的“{”和空行(注意不要不要把log_ID还导在log_ID字段中,因为这个字段数据是自增的,导进去会把重复的行过滤掉只保留一行,如果你不想转完后在WordPress中多标签都变成单标签,这里可以把log_ID导入到log_AuthorID中):

UPDATE  copy_of_zbp_post SET log_Tag = replace(log_Tag, '{', '')
DELETE FROM copy_of_zbp_post WHERE log_Tag = ''

最后把这两列数据导入WordPress表wp_term_relationships中(记得log_Tag不要忘了自增分类数量):

INSERT INTO wp_term_relationships(object_id,term_taxonomy_id)
SELECT log_AuthorID,log_Tag+18 FROM copy_of_zbp_post

写在最后:

评论相关的数据就不再说了,最后不要忘了替换图片资源,同时把这个链接“{#ZC_BLOG_HOST#}zb_users/upload/“也换了,再把固定连接按之前的设置好,把本地数据上传到服务器,还有执行sql语句后记得刷新数据库以免报错,这样ZblogPHP数据就完美转入WordPress了。

Responses