呃~换到 Typecho 了 >.<
之前的 WordPress 因为 PDO (SQLite) For WordPress 插件的关系,最近一次升级后无法升级数据库结构,完全没法进后台了。折腾许久无果之后,趁国庆把整个博客转移到 Typecho 上。
鉴于原先的 WordPress 用了 PDO(SQLite) 插件,而且文章也不多,所以我还是手动迁移了数据。过程中最头大的还是 Typecho 的日期时间存放的是 Unix 时间,而 WordPress 使用的是纯文本格式。
呃……写完发现好像也没什么特别的呢……WordPress 之前有三篇草稿状态的文章,基本上也都是开始写了才发现没什么特别的,就搁置着,汗 = =
今天心血来潮把原来的标签「C/C++」拆成了「C」和「C++」两个,虽说没有了那个很碍眼的斜杠顿时清爽不少,但出现了一个小问题:这两个标签似乎没法并存。
虽然在标签列表里可以显示为两个标签,添加时也可以分别选择添加,但一旦保存,就会又变成只有「C」标签存在。
一番 Google 后,得知如果 Slug 相同会被判为同一个标签,但我的「C++」标签的 Slug 是「cpp」,应该没有这个问题。绕来绕去,失败了 N 多次后,发现在添加标签的地方输入「cpp」保存后就能正确添加「C++」标签。
也就是说让你输入标签的地方实际上要你输入优先判定的是标签的 Slug 而不是 Name?!这是什么坑爹的设定啊?(好吧~WordPress 里标签的 Name 是可以重复的,Slug 不允许重复……)
注意:根据官网介绍,该插件无法在 WordPress 升级后无法自动更新数据库结构。所以如果使用该插件时升级了 WordPress 并且升级需要修改数据库,那么,虽然博客依旧能够继续显示,但是你会被锁在控制面板外,无法登录。使用该插件期间如果需要升级,请参见 http://smilett.com/?p=588。
因为 VPS 内存有限,MySQL 对于我这种懒人来说优化起来又真的是很麻烦,于是在架 WordPress 的时候就用了 SQLite 数据库。于是 PDO (SQLite) For WordPress 插件就成了必需品。
但悲剧的是,这个插件本身是有不少 Bug 的,而这插件也竟然有一年没更新了 ╮(╯▽╰)╭
preg_last_error()
问题
PHP 版本小于 5.2.0 时会出现找不到 preg_last_error
函数的问题。但事实上这个函数本身只是作者用作调试用的,所以可以直接到 wp-content\pdo\driver_sqlite\pdo_sqlite_driver_create.php
把含有 preg_last_error
函数调用的那一行注释掉,问题就解决了。
安装成功后无法登录问题
悲催的我一开始被这个问题困扰了很久 =。= 原因是插件执行安装时既没有获取用户在安装页面输入的密码(这种情况下认为用户没有输入密码,系统自动生成随机密码),也没有把自动生成的随机密码输出。
解决方法是编辑 wp-content\pdo\wp_install.php
文件,把
$message = __('<strong><em>Note that password</em></strong> carefully! It is a <em>random</em> password that was generated just for you.');
替换为
$message = __($random_password . '<strong><em>Note that password</em></strong> carefully! It is a <em>random</em> password that was generated just for you.');
分类和标签消失问题
表现为分类和标签均显示为空(其实也有各种 Quick Edit 出现 PHP 错误的现象)。原因是插件的 escape
方法有问题,如 PHP 错误所说,escape
方法应该在输入为数组时返回一个数组,插件却直接:
function escape($string) {
return addslashes($string);
}
于是,解决方法是编辑 wp-content\pdo\db.php
文件,将其替换为:
function escape( $data ) {
if ( is_array( $data ) ) {
foreach ( (array) $data as $k => $v ) {
if ( is_array( $v ) )
$data[$k] = $this->escape( $v );
else
$data[$k] = $this->_weak_escape( $v );
}
} else {
$data = $this->_weak_escape( $data );
}
return $data;
}