Posts Tagged with migrate

解决wordpress导入mt时的tags和slug问题


MT(4.2rc)导出的TXT文件里其实是有包含tag和slug数据的, 分别标记为TAGS和BASENAME, 只可惜目前wordpress还不支持,小小patch一下

--- wordpress/wp-admin/import/mt.php    2008-04-15 01:26:07.000000000 +0900+++ gopherwood.info/wp-admin/import/mt.php  2008-07-01 10:05:56.000000000 +0900@@ -359,6 +359,16 @@                $category = trim( substr($line, strlen("PRIMARY CATEGORY:")) );
if ( '' != $category )
$post->categories[] = $category;+ } else if ( 0 === strpos($line, "TAGS:") ) {+ $tags = trim ( substr($line, strlen("TAGS:")) );+ if ( '' != $tags ) {+ $post->post_keywords .= $tags;+ }+ } else if ( 0 === strpos($line, "BASENAME:") ) {+ $slug = trim ( substr($line, strlen("BASENAME:")) );+ if ( '' != $slug ) {+ $post->post_name = $slug;+ } } else if ( 0 === strpos($line, "DATE:") ) {
$date = trim( substr($line, strlen("DATE:")) );
$date = strtotime($date);

Migrate to Movable Type


前些天换去vps玩, 本来配的nginx + php + fastcgi的搭配跑了几天后突然罢工, 无论如何也无法正常工作, 不得已放弃fastcgi而使用cgi, 本来资源就不宽裕的vps上性能更是急转直下, 不得已而转向静态发布的Movable Type

如何从habari导出数据是个问题, 导出wordpress的WXR格式的文件是个不错的主意, 能导入wp就基本上随便换哪里了, 况且MT自身也支持WXR的导入. 反正都是要写代码的, 于是决定索性写成插件, 顺便造福一下大众. 于是花了两个多小时调试完, 试着导入wp和mt都正常, 正式换到mt

损失是很惨重的:

  1. tags全部丢失, MT的导入脚本不支持tag 囧...于是300多篇post手工一篇一篇修改tag...用过habari的都知道habari是没有category概念的, 所以导入的post自然也就没有category, 加tag的时候一并加上去了
  2. permlink全部改变, 之前从wp开始的习惯, permlink保持着 /year/month/day/slug 的格式, 换到静态html页面的话, 所有的slug后面都会加html后缀. 刚才又忽然发现, mt的permlink是 /year/month/slug.html 的格式, 没有细分到每一天. 反正permlink都变了, 也就懒得再改了. permlink导致的直接问题是, 搜索引擎要重新收了. 另外, 原本post里引用了其他本章链接的现在链接也失效了...实在很难挑出来这些文章, 也就不改了.
  3. 成功换到mt后便毫不犹豫的删掉了habari的目录, 所以本想造福大众的 WXRExporter for habari 0.1-beta 还没有release就over了...而之前做的些个habari的主题及css也一并没有了, 哭~

这次真得是不得已才换的, 很遗憾没有在habari阵营里坚持的持久一点, 尽管habari还远不够成熟, 但是个人还是很看好habari, 一个很有发展前途的blog程序, 也一定会成为wp的有力的竞争对手

回头说说mt. mt的强大已经是公认的了, 用了一天, 最大的感受是对多blog, 以及多domain的发布支持很好. 只要安装一个mt便可以支持发布多个站点, 很适合在同一个主机上host多个site的站长.

当然静态空间也有缺点, 就是稍微改动模板就要全站重新发布, 这个可以通过SSI来弥补, apache和lighttpd对ssi支持都不错. 配置也很简单. 具体的以后再说吧.

不幸被dimlau拉进了mt阵营, 暂时落脚于此吧

再换 - habari


不是textpattern不好, 用久了就想换换新的玩儿

其实一直都有关注chyrp. chyrp是一个很精简的blog引擎, 简单到连comment, tag, category之类的东西都需要插件来实现. 搬家有点麻烦, 直接从textpattern导入总是乱码, 只好先从txp导入到wp, 然后从wp导出xml再导入到chyrp.

先说一下从wp到chyrp需要注意的:

要导入tag和category自然需要先启用tag和category的module. tag插件有注册wp文章导入的trigger, 但是却是将wp的post的category作为tag导入. 如果用wp2.3以上支持tag的版本就需要改下脚本了. 之后放弃chyrp所以没有留下备份, 不多说了. 至于为什么放弃chyrp, 是因为chyrp的性能实在是不敢恭维, 普通浏览还凑合, 留言的时候几乎无法忍受

chyrp之后尝试了b2evolution. 从b2evolution到wp几乎不需要修改任何东西便可以完美导入. 不过就我一个小小的单用户blog, 用b2evolution这么一个强大的多用户blog系统真是有些浪费. 个人比较不喜欢那些个冗余的功能

从b2evolution出来就瞄上了habari.

habari从wp导入是数据库直接导入, 速度要快很多, 0.4版本不清楚, 不过最新的svn 0.5alpha对tag和category的导入支持都做到了, 唯一需要修改的还是以往的乱码问题, set names utf8搞定. 需要注意的是habari并不支持category, 所以提供了选项导入category为tag, 或者干脆舍弃原有的category

habari的后台选项还不够完整, 除了站名和副标题以外基本就没什么了, 而时区和字符集选项都还只是摆设.

habari并不支持类似wordpress的permlink设置, 所以想要保持原有permlink的同学需要装一个 RN Custom Permalink.

另外为了保持wp,txp的使用习惯, 需要一个 Comment Notifier 插件做留言提醒

默认的habari没有blogroll功能, 所以还要一个 Blogroll 插件, 用feedburner和feedsky的建议装 Feedburner 做feed转向

刚换过来没几个小时就有spam上门了, 所以...看来Akismet也是必要的


迁移: Wordpress 2 Textpattern


Textpattern带了Wordpress的导入脚本,本以为一帆风顺,结果却问题多多,不得已修改了一下脚本,现总结一番
*Update: 所有修改都在 textpatter/includes/import/import_wp.php*
*1. 中文乱码*
老问题了,不过一般都可以用SET NAMES查询来解决,这次也不例外

mysql_select_db($b2db,$b2link);
$results[]= 'connected to wp database. Importing Data';

改成

mysql_select_db($b2db,$b2link);
$results[]= 'connected to wp database. Importing Data';
mysql_query ("set names 'utf8';");

*2. 打开评论*
Textpattern导入文章默认是关闭评论的,这个比较郁闷
差不多刚才那个地方,紧接着是从wordpress里取出post的查询语句

$a = mysql_query("
select
".$wpdbprefix."posts.ID as ID,
".$wpdbprefix."posts.post_date as Posted,
".$wpdbprefix."posts.post_title as Title,
".$wpdbprefix."posts.post_content as Body,
".$wpdbprefix."users.user_login as AuthorID
from ".$wpdbprefix."posts
left join ".$wpdbprefix."users on
".$wpdbprefix."users.ID = ".$wpdbprefix."posts.post_author
",$b2link) or $results[]= mysql_error();

修改查询语句,取出原来post的评论状态字段:

$a = mysql_query("
select
".$wpdbprefix."posts.ID as ID,
".$wpdbprefix."posts.post_date as Posted,
".$wpdbprefix."posts.post_title as Title,
".$wpdbprefix."posts.post_content as Body,
".$wpdbprefix."posts.comment_status as CommentStatus, /* 评论状态 */
".$wpdbprefix."users.user_login as AuthorID
from ".$wpdbprefix."posts
left join ".$wpdbprefix."users on
".$wpdbprefix."users.ID = ".$wpdbprefix."posts.post_author
",$b2link) or $results[]= mysql_error();

保存post到textpattern的查询语句也要修改:

$q = mysql_query("
insert into `".PFX."textpattern` set
Posted = '".addslashes($Posted)."',
Title = '".addslashes($textile->TextileThis($Title,1))."',
url_title = '".stripSpace($Title,1)."',
Body = '".addslashes($Body)."',
Body_html = '".addslashes($Body_html)."',
AuthorID = '".addslashes($AuthorID)."',
Category1 = '".addslashes($Category1)."',
Category2 = '".addslashes($Category2)."',
Section = '$insert_into_section',
uid='".md5(uniqid(rand(),true))."',
feed_time='".substr($Posted,0,10)."',
AnnotateInvite = '$default_comment_invite',
Status = '$insert_with_status'
",$txplink) or $results[]= mysql_error();

改成:

$q = mysql_query("
insert into `".PFX."textpattern` set
Posted = '".addslashes($Posted)."',
Title = '".addslashes($textile->TextileThis($Title,1))."',
url_title = '".stripSpace($Title,1)."',
Body = '".addslashes($Body)."',
Body_html = '".addslashes($Body_html)."',
AuthorID = '".addslashes($AuthorID)."',
Category1 = '".addslashes($Category1)."',
Category2 = '".addslashes($Category2)."',
Annotate = '".addslashes($CommentStatus == 'closed' ? 0 : 1)."',
Section = '$insert_into_section',
uid='".md5(uniqid(rand(),true))."',
feed_time='".substr($Posted,0,10)."',
AnnotateInvite = '$default_comment_invite',
Status = '$insert_with_status'
",$txplink) or $results[]= mysql_error();

*3. 永久链接*
textpattern的永久链接真是不敢恭维,居然不支持中文,如果直接导入的话,所有的文章永久链接里的中文都将丢失,当然用id方式的没关系,但是对于我等使用/year/month/day/title格式的就...为了保持无缝切换(因为之前wp的永久链接就是这个格式),对脚本再一次修改
因为所涉及的查询语句和之前打开评论的完全一样,所以简单说一下,不再重复
1) 取出链接
在刚才插入

".$wpdbprefix."posts.comment_status as CommentStatus,

的地方再插入一句

".$wpdbprefix."posts.post_name as PostName,

2) 保存链接
在刚才插入

Annotate = '".addslashes($CommentStatus == 'closed' ? 0 : 1)."',

的地方找到

url_title = '".stripSpace($Title,1)."',

修改成

url_title = '".addslashes($PostName)."',

*4. 用户显示名称*
之前用wp一直用admin用户发表文章,但是显示名称改成了自己的名字,这样导入的话所有文章的作者名字都会是原始的admin,是个小问题,不过总是看着不舒服,一道改了
找到

.$wpdbprefix."users.user_login as AuthorID

修改为

".$wpdbprefix."posts.post_name as PostName,

*5. tags丢失*
当然这个是对于wp 2.3以上用户而言
在取出post之后是一个while循环,挨个处理post,就在这里取tags吧
找到

while($b=mysql_fetch_array($a)) {
//Clean ugly wp slashes before to continue
$b = undoSlash(undoSlash($b));

在后面加入:

$tags = "";
$t = "
select t.name from
".$wpdbprefix."terms AS t,
".$wpdbprefix."term_relationships AS r,
".$wpdbprefix."posts AS p,
".$wpdbprefix."term_taxonomy as ta
where
p.id=".$b['ID']." and p.id=r.object_id and r.term_taxonomy_id=ta.term_id and ta.term_id=t.term_id and ta.taxonomy='post_tag';
";
$e = mysql_query($t, $b2link) or $results[] = mysql_error();
$tag = mysql_fetch_assoc ($e);
if ($tag) {
$tags = $tag['name'];
while ($tag=mysql_fetch_assoc ($e)) {
$tags = $tags . ',' . $tag['name'];
}
$b['tags'] = $tags;
}

tag取出来了,再作为keyword保存就很简单了,在保存post的地方,也就是在刚才插入

Annotate = '".addslashes($CommentStatus == 'closed' ? 0 : 1)."',

的地方,加入一句

Keywords = '".addslashes($tags)."',

这样就差不多了,然后转个tru_tags插件就和以前一样了
*其实2.3版本的wp已经取消了分类的数据库表,而是和tag的数据库表合并起来,所以textpattern(4.0.5)的导入脚本是不支持tags并且也不能正确导入分类的*

迁移中


真是够累的,从wordpress迁移到drupal,先是把原来2.3的数据导出,新建一个2.2的wp并导入数据,然后……把所有被当作分类的tag手工删除,然后才能利用wp2drupal模块将wordpress的数据全部导入进来

虽然比我想像中的稍微轻松一点,但还是很累的说

接着是配置……习惯了wp的简洁,还是很不适应drupal的,不过也难怪,drupal的定位本就是cms,相对wp的单一,blog只是其中很小的一个功能而已

已经开始有点喜欢drupal了