也谈 SK2 与 cos-html-cache 共存之道
好几天前我就打算写这篇帖子,无奈考试缠身,只好押后到现在——AM11:00 刚刚解脱。
如果你在 WordPress 上同时安装了强大的反垃圾插件 SK2 和强大的静态化插件 cos-html-cache,不久就会发现一个问题:当用户提交新的留言后,即使被自动、人工审核成功,日志页面、首页的缓存都不会更新。——这里说的比较笼统,按照 cos-html-cache 2.3 的机制,这时需要将旧的缓存删除,但它没有发生,即使强制刷新浏览器,你看到的页面还是旧的、没有任何新留言。
这是由于 SK2 留言审核机制与 cos-html-cache 更新缓存的触发条件不相适应引起的。从 cos-html-cache 2.3 的源代码最后可以看到,它通过 hook 到 edit_post 这个动作(WordPress Action Reference)上对新留言的提交做出删除旧缓存的响应;而经过分析 SK2 的留言审核机制,我们并没有看到 SK2 在审核留言成功后发生 edit_post 动作,自然 cos-html-cache 就无法更新缓存,导致问题的原因找到了。
bt4wang 在他写的《SK2 与 cos-html-cache 共存之道》一文中给出了解决问题的思路和方法,即:在 SK2 审核留言成功后,执行一个 comment_approved 的自定义动作,同时将该留言所属的日志 ID 作为参数;在 cos-html-cache 中添加 comment_approved 的钩子。这样修改后,SK2 与 cos-html-cache 的确可以协同工作了,当有新的留言在 SK2 中成功审核后,cos-html-cache 立刻删除首页和该留言所属日志页面的旧缓存文件以便生成新的缓存,到这里还没有结束。
我们会遇到另一个问题,由于 cos-html-cache 对 WordPress 静态化的彻底性,SK2 中一些非常重要的判定条件(SK2 的子插件)不得不被关闭。如 Encrypted Payload,我在之前的文章中已经提到过,这个判定条件会在留言表单(comment form)装载时加入 SK2 的加密数据,只有当该子插件确认在用户提交留言之前,加密数据已经被成功载入到留言表单,留言才会通过该子插件的审核。——SK2 由一系列的子插件组成,各个子插件分别对留言的 karma 做出评估再提交给主插件最终决定审核是否成功。(SK2 中文教程 by Yskin)——由于相当比例的 spammer 机器人直接将垃圾 POST 到 WordPress 的留言页面(除去一些较为“聪明”的机器人或干脆是“人肉”),加密数据这一关自然不会通过;反之,关闭掉 Encrypted Payload,这些垃圾便可以轻松绕过 SK2,尤其当垃圾留言的 IP 和域名不在 SK2 黑名单里,并且内容完全不包含一条链接的情况下。这不能怪 SK2,只能怪我们关闭了 Encrypted Payload。
与之类似的另一个 SK2 子插件是 Javascript Payload,它将打击不支持 JavaScript 的浏览器,因为大多数的 Spam 程序/浏览器不支持 JavaScript。很遗憾,它也得关掉。(我并没有详细研究 Javascript Payload 的嵌入方式,如果与 Encrypted Payload 相同,那么它一定得关掉。)
这些子插件关闭后带来的问题就是一些垃圾留言会漏网,而加强其它子插件的力度则会将正常留言误判。那么我们需要手动地将漏网的判为垃圾、将误判的恢复。这一动作肯定会导致 cos-html-cache 已生成缓存的页面发生变化,更新缓存是必要的。但是 bt4wang 给出的代码并没有解决这个问题,甚至还有一处错误,我对他的代码进行了简单的修改,给手动判定为垃圾也添加了 comment_approved 动作——没有另写一个自定义动作纯粹是为了方便,叫什么名字意义不大。
到目前为止,SK2 已经可以和 cos-html-cache 和睦相处了,只是 SK2 的反垃圾效果会减弱一些,不过仍然远优于 Akismet。下面是 SK2 和 cos-html-cache 需要修改的几处:
1. spam_karma_2_plugin.php 第 139 行附近,在 if...else... 后面添加两行:
{
$sk2_core->cur_comment->set_karma(15, 'web_UI', __("Manually recovered comment.", 'sk2'));
do_action('wp_set_comment_status', $sk2_core->cur_comment->ID);
}
else
{
$sk2_core->cur_comment->set_karma(-30, 'web_UI', __("Manually spanked spam.", 'sk2'));
}
// modified to adjust to cos-html-cache
$comment_post_ID = (int)$wpdb->get_var("SELECT comment_post_ID FROM $wpdb->comments WHERE comment_ID = '$id' LIMIT 1");
do_action('comment_approved', $comment_post_ID);
这是手动审核的部分。
2. spam_karma_2_plugin.php 第 1075 行附近,在 elseif 后面添加三行:
{
wp_notify_postauthor($comment_ID, $sk2_core->cur_comment->type);
}
// modified to adjust to cos-html-cache
global $wpdb;
$comment_post_ID = (int)$wpdb->get_var("SELECT comment_post_ID FROM $wpdb->comments WHERE comment_ID = '$comment_ID' LIMIT 1");
do_action('comment_approved', $comment_post_ID);
这是自动审核的部分。
3. sk2_core_class.php 第 212 行附近,在 echo 后面添加三行:
{
echo __("Thank you. Your comment has been approved.", 'sk2');
// modified to adjust to cos-html-cache
global $wpdb;
$comment_post_ID = (int)$wpdb->get_var("SELECT comment_post_ID FROM $wpdb->comments WHERE comment_ID='$this->cur_comment->ID' LIMIT 1");
do_action('comment_approved', $comment_post_ID);
if ( get_settings('comments_notify') )
wp_notify_postauthor($this->cur_comment->ID, $this->cur_comment->type);
//TODO redirect to comment page...
}
这是“第二次机会”即被要求输入验证码后的审核部分。
4. cos-html-cache.php 最后面,添加两行:
add_action('comment_approved', 'createIndexHTML');
感谢 bt4wang。
感谢 SK2,感谢 cos-html-cache。
cosbeta 2008年01月10日 14:30 ₪
估计过两天我又会看到这样的文章,由于xxx,暂时取消cos-html-cache,哈哈
cosbeta’s last blog post..关于cos_slug_translator
bt4wang 2008年01月10日 14:31 ₪
当时写那篇文,只是把自己的做法共享出来。那时开用cos-html-cache,SK2就挂了。无奈Akismet已经被枪毙,没有办法只有硬头皮去弄。无奈自学不到家,什么都不会,连夜翻Codex才让SK2基本能用。还是你比较利害,进行了更透彻的研究,造福WP人群。
bt4wang’s last blog post..纪念周总理逝世32周年
北极冰仔 2008年01月10日 14:43 ₪
cosbeta » 要对你的用户有点信心哈!
bt4wang » 惭愧惭愧,这个解决方法完全来自你的研究。
李晨英语 2008年01月11日 02:36 ₪
冰仔,是不是要换主机了?可能这个信息对你有帮助: http://stevenlichen.com/2008/01/11/bloggers-and-small-business-owners-take-heed-rudolf-plan-offers-95-usd-web-hosting-for-life/
李晨英语’s last blog post..ABC每日新闻 2008-01-09
北极冰仔 2008年01月11日 10:16 ₪
刚去看了,只是不清楚这个 THC 究竟怎么样,好像还没做多久,估计国内用的人也不多。不过还是谢谢!^_^
北极冰仔 2008年01月11日 10:17 ₪
PS: 95 美元终生计划还是相当有诱惑力的,呵呵。
李晨英语 2008年01月11日 17:08 ₪
是啊,真的是看上去很美
李晨英语’s last blog post..ABC每日新闻 2008-01-09
KHui 2008年01月14日 17:04 ₪
你的是真静态还是伪静态啊?
KHui’s last blog post..分享一组性感桌面
北极冰仔 2008年01月14日 17:41 ₪
KHui » 真静态。
Caine 2008年01月17日 00:19 ₪
完了,完了,被cosbeta搞死了。。。
真应了它那句话:
#
cosbeta
估计过两天我又会看到这样的文章,由于xxx,暂时取消cos-html-cache,哈哈
cosbeta’s last blog post..关于cos_slug_translator
01-10-2008 14:30
偶现在是禁止插件都没用。。。哭死。首页被静态死了。
Caine’s last blog post..wrodpress升级2.3.2测试一贴
北极冰仔 2008年01月17日 08:50 ₪
Caine » 这有什么好哭的?把 blog 目录下的 index.html 文件手动删掉不就好了吗?