这两天垃圾评论越来越多了,以前一天20封,现在一天没上网,垃圾评论100多。每次临近过年的时候都会收到好多人的告诫,“快过年了,注意提防小偷啊,因为小偷也要抓紧干活准备过年嘛。”今天是圣诞节,过两天就是元旦了,国外的spammer是不是也在准备过年啊?
以前用的是重量级插件Spam Karma 2,不过已经停用好久了,SK2太重量级了,我的小Blog还用不上。这几个月一直用着WordPress自带的评论审查功能,在WordPress后台->选项->评论选项里可以找到。WordPress提供了两个功能,一个是“评论审查”,将符合审查关键词的评论的comment_approved值设为0,这样评论被缓冲,并不显示出来,等待管理员来处理。另一个是“评论黑名单”,将符合黑名单里的关键词的评论的comment_approved值设为"spam",这样评论不会显示,也不会在后台->管理->等待审查列表里显示出来。
用黑名单固然好,不用管理员处理,不过可能会误封一些正常评论,而且评论仍然在数据库里,还占用一个ID号。用评论审查呢,可以随时到等待审查列表里检查截获的垃圾评论,看一下,把误封的挑出来,其他的全部删除,这样不占用数据库空间。缺点是,还是被占掉一个ID号,而且垃圾评论会同时出现在管理->等待审查和管理->评论两个列表里,每次去看评论都要先去等待审查列表里清一下垃圾评论,也不是很方便。
于是就写了个小插件,解决一下这个问题。在"pre_comment_approved"那里hook一下,检测到评论被设置为spam就直接die(),hoho。
我的Blog只需要设置两个关键词:"...</strong>"和"[/url]",就可以屏蔽掉几乎全部垃圾评论了。
P.S. Merry Christmas. 昨晚平安夜,有没有放袜子在床尾啊?一定要白色棉袜子才行的哦。
Update:修改了一下,添加了一个功能,可以过滤所有包含"...</strong>"字样并且一个汉字都没有的评论。基本上带"[/url]"字样的评论都是针对那些使用UBB之类代码的Blog,可是WordPress本身不支持。带有"...</strong>"字样的,一般都是Trackback。好像有一些系统,甚至有些WordPress发送的Trackback的内容是以"<strong>...</strong>"开头的,不过我的Blog里目前只有7条是这样的。没仔细看WordPress源代码,好像大多数WordPress发送的Trackback不是这样的啊。黑名单只能过滤字符,不能做进一步的判断,所以我给插件加上一个功能,可以判断评论里是否有这样的字样,并且在评论不包含汉字的时候直接清除。这样基本上不会误删了。
写这个插件耗了不少时间,我也学到一些PHP知识。比如,表达式'spam'==true的结果是true,'spam'==0的结果是true。所以要用三个等号===进行判断才准确。还有WP的add_action()函数的用法,唉,复杂复杂。
Update2:到今天为止,这个插件用了整整半个月了。现在垃圾评论平均每天一条吧,插件的效果还算不错。
请移步到“Yskin's Kill Spam Comments”主页下载软件并查看更多信息。
2006年7月低,K2 r16版里加入了SBM,从此以后,K2模版用户可以很方便地控制自己的sidebar,而不用再辛苦地修改sidebar.php文件了。
一直没研究SBM,这两天抽空研究了一下,发现还是蛮好玩的。
继续阅读《开始使用K2模版自带的SBM》
昨天和今天研究了一下K2自带的SBM,把我的sidebar改用SBM来控制。改到最新文章时,发现K2自带的latest posts模块和K2的sidebar.php文件里的代码不一样。sidebar.php里只有一条语句:wp_get_archives('type=postbypost&limit=10');,latest posts模块里却用了
$latest = new WP_Query($query);
foreach ($latest->posts as $post)
{setup_postdata($post); echo ...}
联想到几天前alonefly大大提到的模板中的判定问题,去查了一下hoofei4模版。hoofei4用的是:
<?php query_posts('showposts=10');
if (have_posts()) : while (have_posts()) : the_post();
echo ...
endwhile; endif; ?>
hoofei4模版里这样用显然会导致之后的代码无法判断当前页面类型,is_home()之类的函数返回值已经不正确了,无论什么页面,在此代码之后的is_home()函数都会返回true。别的不说,hoofei4模版sidebar里定义链接列表和meta为只在首页和page页显示,可是http://www.hoofei.com/网站里所有的页面,包括文章页存档页都会显示这两样。
我特意在我的Blog上做了测试,hoofei4模版的用法会影响is_home()等函数的判断,而latest posts模块的用法却不会,可能是因为新建了一个WP_Query对象的缘故吧。不过,setup_postdata()函数还是会影响几个全局变量,而且执行速度也较慢。
不知道这样的代码是从哪里来的,谁最先想出来的。可以肯定的是,他是一个高手,懂得用query_posts()函数,但是,他却不知道WordPress提供了最新文章功能,只要调用一个函数即可。呃,我推测,可能是以前WP 1.5或者1.2的时代里,WordPress还没有提供这个函数,所以有人写了这样的代码,后来被人抄来抄去,就流传到了现在。
不过,WordPress自带的还是不能满足我的要求,我想显示的不是最新发布的文章,而是最新修改的文章。7月12号,我从wp-includes\template-functions-general.php中的wp_get_archives()函数里抄了一段代码,修改为显示最新修改的10篇文章,放在sidebar.php里。现在,我又把它改了一下,做成最新文章插件,并提供对SBM的支持。
这年头是不是每个WordPress插件作者都要写一个自己的最新文章插件和最新评论插件啊?嘿嘿。
请移步到“Yskin's Latest Post”主页下载软件并查看更多信息。
11月17号开始写这个插件,现在事12月16号晚上8点整。哈哈,这个插件花了不少时间,现在回过头来看,倒是有点怀疑我是否该把插件写得那么复杂。
本插件的葫芦是Feed Control
。
今天先release着,明天再详细的写,嘿嘿。
抓虾在以前一直都是不读取文章的更新,一篇文章读进来什么样子就是什么样子,文章更新了抓虾也不更新,前段时间开始读了,后来又停了,真是○○××。唉,Bloglines又慢,或许,要是Google收购了Bloglines,速度应该能快起来。
汗了,好像没放上page的链接。我要feedback啊feedback。
请到Feed Control Plus插件主页查看更多信息以及下载插件。
AIP在评论里说,Admin Drop Down Menu
插件在IE下不好用。
这个插件我是6月份才开始用的,而Firefox我从3月就开始用,并在此后很少再碰Maxthon了,所以我并没有注意到这个问题。在插件源代码里转了一圈,改了一通CSS也没解决这个问题。后来想了想,还是Edward说的对,换个插件就是了。
在Google里找到Admin Drop Menus
插件。这个插件确实可以把WordPress后台装扮的很漂亮,比起Admin Drop Down Menu好看得多。并且,插件只修改了menu部分,不像WP Tiger Administration
那样修改了后台页面的整体布局。

不过这个插件有一个缺点,我的后台的字体显示成繁体的样子。看了一下CSS,里面定义了很多字体,包括日文等等。我在里面加了宋体,显示出来的效果还可以。
这个插件的作者写了好几个Admin Drop Menus插件,代码大体一样,只是样式不一样,分别取名叫Native、SpotMilk、Autumn风格。有一个特殊点的叫Admin ‘Advanced’ Drop Menus
,既然写明是‘Advanced’高级的,那么我就试试。看起来这个插件把menu修改得更面目全非,不过也更漂亮。不过还是有一个缺点,一级菜单已经不能点击了,只能点击二级菜单,这下写新文章要点两下了,不爽啊。

Admin Drop Menus这个系列的插件适合喜欢漂亮的人,还有使用IE的人。我还是用回Admin Drop Down Menu,它在我的Firefox下工作的很好。
今天Edward告诉我,他已经删除了Blog,开始重建。于是我通过Google的cache浏览了一下他的Blog。找到一篇介绍mimeTeX的文章。
在网上查了一下,“TeX是七十年代末,Donald E. Knuth在看到其多卷巨著《The Art of Computer Programming》第二卷的校样时,对由计算机排版的校样的低质量感到无法忍受。因此决定自己来开发一个高质量的计算机排版系统,这样就有了TeX。”[via]前几天在网上下过《The Art of Computer Programming》的中文版《计算机程序设计艺术》,其中的第2卷:《半数值算法》好像网上很少有下载,我在找了很久才找到。在寻找的过程中,好像在china-pub看到过相关的介绍,Knuth本来想写7卷《The Art of Computer Programming》,结果只写3卷就转而去开发TeX了。找到一个《TeX基本知识》,介绍的还挺全的。
继续阅读《在WordPress中使用TeX》
写了一篇文章,用<pre>标签包了一段代码,结果u'\xc9\xab'这样的代码里反斜线\自动消失了。这个事以前也碰到过,直接把反斜线打了两遍,发布文章后就会变成一个了,不过修改文章时,那一个反斜线又消失了。今天认真地查了一下,在WordPress源代码里逛得头晕,于是到WordPress Trac里拿"backslash"做关键词搜了一下,找到了3个月前有人报的bug:backslash disappears in <pre>。8月26号报的bug,现在也不处理,唉。
按照他的提示,在/wp-includes/functions-formatting.php文件里找到了wpautop()函数中的这句$pee = preg_replace('!(<pre.*?>)(.*?)</pre>!ise', " stripslashes('$1') . stripslashes(clean_pre('$2')) . '</pre>' ", $pee);。按照PHP文档里stripslashes()函数的说明,它应该是剥去单引号、双引号以及反斜线之前的那个反斜线,不过实际操作中,这个函数好像把每个字符前面的反斜线都给剥去了。
这事好像很麻烦,好像PHP文档并没有说清楚,而众多PHPer都误用了。下面的一条留言里提到:"If you want to deal with slashes in double-byte encodings, such as shift_jis or big5, you may use this"双字节的编码,除了ASCII和欧洲的那几个,其他的不都是双字节编码?晕倒了。
照着他的函数修改了一下,得到下面的函数:
function stripslashes2($string) {
$string = str_replace(array("\\\\\\"","\\\\'","\\\\\\\\"),array("\"","'","\\\\"), $string);
return $string;
}
然后,把第83行的stripslashes(clean_pre('$2'))改成stripslashes3(clean_pre('$2'))就可以了。
今天照着《WordPress执行效率问题》一文检查了一下我的Blog首页执行的SQL语句。具体方法那篇文章里讲了,就是在wp-config.php文件里添加define('SAVEQUERIES', true);,再在footer.php文件的尾部加上一句<!-- <?php var_dump($wpdb->queries); ?> -->。刷新Blog首页,就可以在页面源代码的尾部找到整个页面执行过程中所提交的所有SQL查询语句了。数组里每一项都包含一个string和一个float,string存储查询语句,float存储查询时间。先看看查询时间,看看哪个占用的时间很长;再看看查询语句,看看哪个可以省略,哪个可以cache起来的。
我的Blog打开的WordPress自带的cache功能,首页需要32次查询,执行时间1s多一点。查了一下,我的Latest Comments插件占了9项。给它加了个cache功能,现在首页已经降到23次查询,执行时间也降到1s以内,8错8错。
很疑惑,为啥他说他有6万篇文章。我大概看了一下,不到500篇文章吧。而且他的大多数查询和我一样,耗时只有零点零零几秒,而查询wp_posts表的几条耗时很多。我的SQL查询语句耗时最多的也就0.01秒。好奇怪,难道wp_posts表被塞了太多垃圾?
Update:昨天研究了一下WordPress的cache功能,给我的wp-statistics
插件增加了输出cache命中次数的功能。
WordPress的cache统计有Cold Cache Hits,Warm Cache Hits,Cache Misses三项。Cold Cache Hits指从cache文件或者数据库中读取的,Warm Cache Hits指cache已经读到内存的,Cache Misses指没命中。不看不知道,我的Cold和Warm命中分别有160次和534次,哇,这要节约多少查询啊。
我的Cache Miss次数是14,觉得有点太高了一点,于是在/wp-includes/cache.php文件里做了个小hack,让它把miss的$id输出出来。检查了一下,有3项是options的,其中2项属于Ultimate Tag Warrior
,1项属于Audio player
。另外11项是pages,一个空ID和首页10篇文章的10个ID。
看了一下WordPress的源代码,在get_post()函数里,WP通过检查该post_id是否在pages的cache里来判断其是否为page,这才导致了10篇文章进行了10次查询导致了10次miss。由此看来,WordPress对"page"也不薄,起码给page做了cache,而post则享受不到这种待遇。
UTW的2项是UTW新版才加进去的option,UTW好像没有在升级的时候自动建立这两个option。在后台进入UTW选项页,点save,发现数据库里没更新。没办法,只好把那两项选中后更新,好了,数据库里有了。然后再返回来,取消选中那两项。而Audio player的那一项,则是在版本升级的过程中,这个option被删除了。而插件每次启动的过程中,通过判断这个选项是否存在来决定是否执行升级程序。所以,又有了一个miss。唉,这样看来,老外的插件设计的也不咋地啊。
好了,Cache Miss降至11,首页SQL查询次数降至18次,执行时间降至0.6s,已经差不多被我榨干了,再想优化,就该祭出WP-Cache
插件了。
又到了一星期一次的看QQ聊天记录时间了。
QQ:510128(http://www.skfu.com/)问:“WordPress的admin密码忘了怎么办啊,谁知道那个原始密码来?”
WordPress有找回密码功能。大概看了下代码,并尝试攻击了下,无果,555~~不过,找回密码时,WordPress会给管理员的邮箱发一封重设密码邮件。利用这个特性,进行一次email DOS攻击也不错哈。
- 从Blog的About页或者其他途径获得管理员的邮箱地址。
- 进入http://域名/wp-login.php页面,点击"Lost your password?",进入找回密码页面。
- 用户名输入"admin",email地址输入找到的管理员邮箱地址。点击"Retrieve Password"。一封重设密码邮件将会发给管理员。
- 点浏览器的后退按钮,点"Retrieve Password",一直循环下去,直到累了为止,hoho
http://www.gtp2p.com/的WordPress 2.1 alpha3成功:(WordPress 2.1真是漂亮啊)

http://blog.edward.in/的WordPress 2.0.5成功:

怪好玩的,呵呵。Email DOS,创意不错吧
另外,wp-login.php第130行的$key = preg_replace('/a-z0-9/i', '', $_GET['key']);。这里应该写个正则来把$key里的所有非字母数字的符号删除才对,因为md5里都是字母和数字吧。可是这个正则表达式好像什么作用也没有呀,字符都是原样输出的。唉,我知识浅薄,实在没看懂这个正则。
Update:WordPress 2.0.6-alpha-1修正了这个bug,参见Changeset 4581。/wp-includes/functions.php和/wp-login.php文件里的正则表达式都修正了。不过我还是没弄明白这个正则,也想不到攻击的办法,唉...
正在看QQ聊天记录。现在懒得开QQ,隔几天登陆一下http://group.qq.com看WordPress群(8191389)的聊天记录。腾讯个小气鬼,一点纯文本的聊天记录也只给存7天,小气死了。
11月14号,levis/强龙(16723852)问,怎么WordPress后台的评论页面不能翻页啊?我看了一下,确实不能翻页,只能显示一屏20条评论。我都没在意过这件事,因为评论不多,而且我又每天上网检查,很少有机会查看20条以后的评论。在WordPress源代码里看了下,好像有评论开始位置的设置,但是这个功能没有做全。
在http://域名/wp-admin/edit-comments.php这样的评论页面里可以查看最新的第1~20条评论,在URL后面加上?&offset=1,回车,这样就可以查看第21~40条评论了。后面的依此类推。呃,还是有个小bug,第二页的序号21~40显示成20~39了,呼,以后要引以为戒呀。
另外,可以查看一篇文章的所有评论,只要在文章管理页面点那个评论数就可以了。比起在所有评论里一页一页的查找,这样还方便些。如果在查看文章时要看看某个评论的具体信息,比如评论者IP什么的,只有拿着文章的ID,输入http://域名/wp-admin/edit.php?p=ID号即可。不知道ID号?以管理员身份登陆进WordPress后,在文章页面,把鼠标移到编辑文章的那个按钮上,然后看一下状态栏就可以了。 