Archive for the ‘WordPress’ Category

WordPress中的英文(半角)单引号
Friday, April 18th, 2008

在WordPress里,保存文字时系统都会有一些filter函数对输入的文字进行处理,然后再输入数据库。但是这个过程中英文(半角)单引号的处理有些诡异。

无论是在设置中的blog标题,还是日志,输入的英文单引号都会被转换成”’”这样的表示方法。在HTML页面中输出特殊符号(HTML entities)时转换成这样的表示非常值得推荐,问题是”’”表示的是全角的单引号,即中文的单引号。

我们一般也不会在意,不过昨天,我帮她搬家的国内互联网某知名博客(其blog标题中有个单引号)说很丑。于是我想了想,英文单引号的正确表示是”'”,填入,然后点击Save Changes。嗯,真正的英文单引号显示在了标题栏,世界清净了。

不过此时要注意看,Blog Title输入框里的”'”又变成了英文单引号!如果再次点击Save Changes,那么前功尽弃,单引号又变成了全角。所以每次保存这个表单时,都需要把这个引号用”'”替换,再保存。

从blogbus搬家到WordPress
Thursday, April 17th, 2008

最近刚刚帮国内互联网某知名女博客搬了家,稍微写点东西。

据她说,许多人对她说“使用wordpress是成名的第一步”。又据说还有Blogbus的人跑去留言“Blogbus竟然还有这样的人”。要是一直用WordPress,早就火了。

Blogbus也算国内数一数二的BSP了(新浪、搜狐那些不能叫做blog,也就不算在BSP之列——顺便鄙视一把),导入功能做得炉火纯青,然而导出就只是作为备份用了。这也不能怪blogbus,因为各种blog平台之间并没有统一的交换格式。普通的RSS输出显然不能胜任,因为完整的转换至少还要包括评论以及评论与日志之间的对应关系。

然而一旦有了备份,一般情况下也就解决了问题。比如WordPress就提供了导入Movable Type导出文件的功能,Movable Type同样也有导入WordPress eXtended RSS(WXR)的功能。

不过东方文明还不为西方世界所熟知,譬如Automattic就不知道东方有一个Blogbus,所以WordPress没有直接提供导入Blogbus文件的功能,我们只好绕一些弯路。

事实上这条路已经有很多人走过。冰古算是一位先驱,先后几次更新他的转换程序

这里又有一位blogger在冰古的启发下写了一个从blogbus备份转换为MT导出文件的脚本,使得评论也可以导入WordPress,但是该文章中的下载似乎已成为死链接。另外许多用户反映在服务器上运行时,浏览器中不能显示程序的输出,从而无法复制。这是由于脚本的第一行中指定了Content-type: text/xml,浏览器就将它的输出作为xml格式解析。解决办法就是改为Content-type: text/plain.

下载脚本文件

我转换的过程中,分类没有导过来,其它的还算正常。

对付垃圾留言的较好方案
Monday, August 13th, 2007

垃圾留言真是blogger们心中永远的痛。

在Akismet被封后,我一度不知道如何应对蜂拥而至的spam. 后来我关闭了Pingback和Trackback,然后把spam中常用的词写进了黑名单。黑名单有些效果,大部分的spam都没了,可是还是有不少漏网之鱼,例如有个垃圾就天天写ro***ck,邮箱是随机的,IP不固定,中间那几个星号也是随机。我就是拿它没办法。另外也造成了留言者的不便,因为黑名单中的词也很可能被正常的留言使用,例如我当时就把“…”放进了黑名单。

最近一次误删了blog,我又开始寻找对付spam的好方法。

首先,对付comment spam,我认为最好的是WP-Hashcash,不需验证码(额外的输入使留言者感到繁琐而且影响注意力),留言者只要启用了JavaScript就可以成功留言,而spam bot一般难以模拟这种行为。

你也看到了WP-Hashcash那里也写出了Limitations,除了需要启用Javascript(现在哪个网站不需要Javascript?),还有不能阻止Trackback/Pingback spam。

对付trackback/pingback spam,可以用Simple Trackback Validation Plugin。之前我用过RICE大学的人搞的Trackback Validator Plugin,效果不好。这个新的插件就是基于RICE的插件改进的,我打开trackback好多天了,收到一些正常的trackback/pingback,还没有发现spam。很好!

这两个插件的组合,我认为比Akismet强多了。Akismet会放过一些spam bot,还会误杀一些非spam的留言,这两种情况都被解决了,而且数据库空间没有浪费。什么Spam Kama,什么bad behaviour,都回误杀无辜,误杀率比Akismet大得多,通通不可取。

当然对于人工spammer,我们还是束手无策。前几日有人在我站上发了一个留言,我看到了,比较正常。过一会又发一条,哇,竟然是那传说中的人肉spammer!二话不说,连同那个正常的留言一起删了,妈的!这位仁兄,你还会来看我blog吗?骂的就是你!

spam几乎绝迹,用一个时下流行的词说,叫和谐。用原始社会的话说,叫清净。

将文章同步到Live Space中去
Tuesday, July 31st, 2007

MSN上的朋友们,现在你们可以及时看到我的Blog更新了 :)

许多人还是不大喜欢用RSS订阅,而Live Space的更新会及时地在MSN联系人前面显示一个小星星。

我用了Live Space Sync这个插件来把我的Live Space与这个blog同步。至少从已经转过去的文章看,效果是很不错的。

不过那边基本就是一个通知,我只管把文章推过去,评论还是来这边好了,呵呵。那边的评论我关闭了。

可能还有很多朋友、同学不知道我在写blog吧,哈哈,欢迎大家以后多来看看 :) 从生活到技术,什么都乱扯。从体系结构到编译器到高级语言到Web前端,知道什么写什么。

用密码保护整个blog
Friday, February 9th, 2007

WordPress 只提供对某篇文章进行密码保护,但它的标题仍然显示。如果你的Blog是写日记,可能什么都不想让外人看到。

WP支持论坛的一个主题中给出一种非常简单的解决方案,未登录用户自动被重定向到登录页面。将以下代码复制到你的Blog根目录下,并将$siteurl变量赋予正确的值(从论坛里直接复制的代码似乎有问题)。

<?php
$siteurl = 'http://your.blog.url';

$cookiehash = md5($siteurl);
if(empty($_COOKIE['wordpressuser_' . $cookiehash])) :
header('Location: /wp-login.php');
else :
define('WP_USE_THEMES', true);
require('./wp-blog-header.php');
endif;
?>

刚才朋友让我给他弄密码保护,我把自己的改了一下,然后告诉他好了。刚才上自己Blog出了问题,才想起来改错了。。。我说怎么好几个小时没收到垃圾评论呢,看来对付spam最好的办法还是──关站。

Blog换了个样子
Thursday, January 25th, 2007

那个blue-tech主题虽然刚用时感觉清爽,过了一段时间还是有点疲劳了,于是自己动手,多方参考,做了个新主题。

几乎就在同时,Google Groups的新面孔推出,与我的blog主题惊人的雷同,这绝对不是巧合。

设计网站还要考虑IE这样老掉牙的浏览器,真是一件痛苦的事。麻烦各位给看看,怎么让IE显示导航条跟Firefox的效果一样,谢谢了。Opera我看了一下也正常,不知道IE7正常不。如果只是IE6,就不管它了。

有空再往好弄。

升级到WordPress 2.1
Tuesday, January 23rd, 2007

今天考完最后一门课回来发现WordPress 2.1终于发布了。看了一下马上就升级了,备份都懒得做。结果出人意料的顺利,什么问题都没有,我都感觉很奇怪,因为所有插件我都没照升级说明指示的禁用掉。

尤其是Brian’s latest comments刚刚发布了1.5.8,以解决与2.1的兼容问题。这说明2.1正式发布时又保持了对以前插件的兼容性。不过还是挨个把各个插件换到了最新的版本。

这个版本最好的最实在的功能就是加上了自动保存功能,太爽了(可惜的是Trackback框不会被保存,是这样吗?)。另外也有其它一些改动,详见WordPress 2.1的发布日志

也就这些。它已经够成熟了,就像Blizzard要出TFT1.21补丁,也没多少激动人心的东西一样。

由于日志和链接的种类被合并,所以链接原来的link_id很可能变了,这一点在自己调用函数的时候要注意。

自动更新水木签名档
Saturday, December 16th, 2006

有人想要这个自动更新签名档的插件,我就整理一下放出来吧,有兴趣就用。插件的功能是每次有新日志发表时,自动更新水木社区的签名档,显示最新的两篇帖子,删除日志时也会更新。

它是用curl通过模拟Web登录实现的,本来想改成模拟telnet的,发现更复杂,遂作罢。

想用这个插件,首先请注意以下几点:

  • web登录的窗口是有限制的,超出了会提示,这个我没有处理,所以登录过多的话更新可能不成功。不过插件本身的模拟登录会自动退出的,一般term用户不会有问题。
  • 需要服务器的PHP支持curl。即便支持了,有的服务器可能仍然不允许这种对外请求。
  • 签名档六行一个,可以设置多个,插件的代码只生成一个,并且会把你原来的所有签名档覆盖,千万注意。通过修改代码,想设置多个也可以。
  • 这种东西不是那么稳定,所以有时候更新不成功也找不到原因。可能等一段时间就更新过去了。

愿意尝试的话,从这里下载,照如下步骤设置:

  1. 把sig-update.php中的用户名和密码填上,需要的话,把生成签名档的代码(SQL,PHP)改改。我就懒得在插件中做配置页面了,估计也没多少人用,呵呵。
  2. cookie文件是必要的,且传到服务器上要可写,否则无法更新。
  3. 将sig-update目录上传到插件文件夹中,激活。如果一切正常,再发文的时候签名就会更新了。

***有兴趣的继续看***

这个东西可能不太实用,不过对curl模拟web登录可以作为粗略的参考。首先POST自己的用户名、密码给登录页,获得一个cookie,在以后的请求中把这个cookie带上就可以了。最初中文发过去是乱码,后来发现水木页面编码是gb2312,于是把中文用mb_convert_encoding函数转换了一下,问题解决。

由于WordPress中,hook到delete_post的函数在删除之前执行,因此需要在SQL查询中把它给去掉。另外在编写的过程中发现,激活的插件中的代码在所有的管理页面载入时都会执行(没注意非管理页什么效果),需要特别小心。还有插件代码是被其它文件调用的(可能是wp-admin中的吧),因此工作目录并非这个插件所在的目录,那个cookie还是用绝对路径比较好。开始的时候就是搞不清楚为什么不能更新,原来是找不到cookie。