移植plog数据到WordPress

由于两种Blog使用的字符集不一样,所以移植的重心是unicode字符到utf8字符的转换,剩下才是数据表之间的对应。

首先用phpMyAdmin把plog的数据导出来,要知道导出来以后的sql文件中,中文都是这种乱码形式的:

INSERT INTO `plog_mylinks` (`id`, `category_id`, `url`, `name`, `description`, `blog_id`, `rss_feed`, `date`, `properties`) VALUES (1, 1, ‘http://blog.plogworld.org.tw/’, ‘pLog 中文開發日誌’, ”, 1, ‘http://blog.plogworld.org.tw/rss/rss20/1’, ‘2005-05-17 21:59:37’, ‘a:0:{}’);

配合网上找到的unicode2gb函数,可以把这些乱码转换为utf8字符,不过在转换前,有两个东西需要注意,第一个: \是\,plog不认的,需要先手工替换过来,否则转换有错误提示:

Notice: Undefined offset: 92 in E:\web\20051106\unicode.php on line 68。

而WordPress对\不感冒,所以直接在sql文件中替换就可以了。 第二个:“”—这几个字符总是会引起附近出现乱码(第三个好像还不是中文的破折号),手工替换成自己命名的符号,比如< –left quote–>,在中文转换完毕之后再替换回来就可以了。

网上有unicode2gb函数,不过不是太好找,并且需要的gb2312.txt也不好找,所以我打包放在了这里,需要的同志可以去下载。

现在最麻烦的事情来了,由于sql文件中有简体中文,也有繁体中文,所以unicode2gb函数需要略微调整一下,把:

        $code=0x8080|$_global_codetable2[$code];
        $gb.=chr((($code & 0xFF00)>>8) & 0xFF);
        $gb.=chr($code & 0xFF);
改为
    if (isset($_global_codetable2[$code]))
    {
        $code=0x8080|$_global_codetable2[$code];
        $gb.=chr((($code & 0xFF00)>>8) & 0xFF);
        $gb.=chr($code & 0xFF);
    }
    else
    {
        $gb .= '&#' . strval($code) . ';';
    }
使用码表文件gb2312处理完毕之后,本来想着用繁体中文的码表处理一遍就可以了的,但转换出来的中文有乱码,所以经过半天的琢磨,终于发现了解决方法--先换用码表gb12345.txt转换一遍,还剩下一些没有转换的字符,然后再用big5.txt这个码表转换,在最后使用这个big5.txt码表文件的时候,还需要增加把繁体中文字符串转换为简体中文字符串的处理,所以上面的编码又要改动为:
    if (isset($_global_codetable2[$code]))
    {
        $code=0x8080|$_global_codetable2[$code];
        $strbig5 = '';
        $strbig5.=chr((($code & 0xFF00)>>8) & 0xFF);
        $strbig5.=chr($code & 0xFF);
        $gb .= mb_convert_encoding($strbig5, 'GBK', 'BIG5') ;
    }
    else
    {
        $gb .= '&#' . strval($code) . ';';
    }
这样,这个sql文件终于成了全中文,基本无乱码,下面在本机建一个utf8_general_ci的mysql数据库,把sql导入进去。

然后的事情就简单了,通过本地mysql查询和对sql文件进行正则表达式替换,先后生成往wp_categories、wp_posts、wp_post2cat表中添加数据的sql,还有修改wp_posts表中post_date、post_date_gmt、post_category等字段的sql,在本地测试后,一一导入WordPress,就大功告成了!

在生成sql语句的时候还要注意,除了VALUES里面能够使用单引号’来标识字符串之外,其余标识数据库表名和字段名的引号一定要是键盘左上角的`,使用单引号mysql会提示错误。

用Flickr?还是用pLog的Album?

主要指的是图片啦,两者都可以很好的保存我想在网上发布的图片,pLog可能更个人化一些,但速度不理想、功能不够丰富、对空间也有要求;而Flickr让我有点不放心(哪天改收费了、哪天Down了、哪天我的图片没了都有可能吧?),但却更方便,速度也快,也不用担心空间问题。这两个活宝,用哪个好呢?一直在琢磨,但说老实话,pLog Album的功能太少了,也不是特意针对图片来优化的,还兼顾了其它格式的文件,不如Flickr专业,并且Flickr被Yahoo收购了,不放心的程度有所降低,所以在目前尽可能的使用Flickr吧。

原来也在使用cpg来管理图片,但它傻傻的把所有图片都放在一个目录里,真无法忍受(pLog也一样,这样应该不太适合上千张图片的处理),尤其是升级到1.3.3以后,居然无法上传图片了,提示什么“程序被呼叫而没有需要的参数. ”,真是太让我伤心了,我都存了几百幅图片了,不知道以后的版本能否更好些。

cpg的错误画面

小试trackback

Trackback怎么说也是BLOG的特色功能之一,以前确实没用过,现在在PLOG中着实又被迷惑了一把,原来,PLOG要发送trackback,除了在所写的文章中要包含需要ping的文章的地址以外,还要选上右下角的“”,保存以后,系统才会提示你需要向哪个地址发送ping。

最关键的,也是最容易出错的地方,就是上面所说的包含对方文章的地址,必须是它的“permalink ”,也就是静态地址,并不是trackback/引用的地址,并且参数的顺序也不能错(这一点容易疏忽)。我在尝试ping风的blog!的时候,就是因为它的页面地址是:

http://www.lvwo.com/blog/index.php?op=ViewArticle&blogId=1&articleId=181
而permalink静态地址是
http://www.lvwo.com/blog/index.php?op=ViewArticle&articleId=181&blogId=1
只一个参数顺序之差,就无法ping成功。

究其根本原因,原来PLOG是通过页面地址内容,自动发现trackback地址的,也就是通过文档中的XML说明来确定的,类似

      <!-- <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"> <rdf:Description
rdf:about="http://www.lvwo.com/blog/index.php?op=ViewArticle&amp;articleId=181&amp;blogId=1"
dc:identifier="http://www.lvwo.com/blog/index.php?op=ViewArticle&amp;articleId=181&amp;blogId=1"
dc:title="UTF-8还是GB2312称雄blog"
trackback:ping="http://www.lvwo.com/blog/trackback.php?id=181"/>
</rdf:RDF> -->
如果选用的地址无法匹配说明中的identifier,自然就无法找到trackback地址了。

pLog安装在PHP5下无法进入管理界面问题的解决

刚开始搭建pLog平台的时候,使用的是PHP4,后来转移到正式服务器上之后,发现后台管理页面登录之后,凡是带有admin.php?op= xxx的页面全部无法进入,提示“Access is forbidden. You must authenticate first here.”,刚开始以为是在数据库从测试服务器导出、又导入到正式服务器中出了问题(因为还存在一个MYSQL 4.0 -> 4.1的升级),后来放弃了所有已经保存的设定参数,重新从建立数据库开始在正式服务器上安装,问题依旧。翻看源代码很久,才发现问题原来出现在 SESSION数据的读取上,但还是无法确定具体问题。GOOGLE了许久,在台湾的pLog 中文开发论坛这篇帖子里终于找到了启发。

pLog在目前的设计中没有完全兼容PHP5,因此上述问题的根本原因如下:
1、pLog使用类似 if( phpversion() >= "4.1.0" )的语法检查当前PHP的版本,如果版本低,则从$HTTP_SESSION_VARS中读取全局变量。而PHP5中提倡使用version_compare()来比较PHP的版本,phpversion()返回值是string类型,直接和字符串比较的结果可能会有误。
2、在比较失败的情况下,PHP5的的默认设置又关闭了register_long_arrays,$HTTP_SESSION_VARS也就不存在了,所以SESSION数据无法获取,系统判断用户没有登录。

解决方法:在PHP.INI中设置register_long_arrays = On,重启APACHE,OK了。