SK 2 与 cos-html-cache 共存之道
发表于 2007年六月5日
分类为 WordPress | 标签 SK2,静态化 | 13 条评论
这几天在忙一个事情,那就是将本站的 home、page 和 post 页面静态化了,全部生成html文件,这样访问时可以尽可能减少数据库访问,加快访问速度,这对我用的这种空间还是有很大意义的。
静态化主要采用了 cosβ 编写的 cos-html-cache 插件。由于根据作者的建议,更改了永久链接结构,为了以前的地址能保持继续访问,又安装了 Dean’s Permalinks Migration,用来转换链接。关于这两个插件的相关问题,可以分别访问各自的官网寻找。
下面谈谈我遇到的问题。本 BLOG 虽然其貌不扬,知名度不高,但始终有一定量的 spam 攻击,虽然不多,但是很讨厌。以前用 WP 官方的 Akismet 可以很好的防御这个问题,但是自从其服务器被墙之后,就经常不正常工作。后来就换上了目前使用的 Spam Karma 2 插件,效果是很不错的。
但是这个效果不错的 SK2 似乎和 cos-html-cache 不和,SK2 通过评论后,cos-html-cache 不启动重建缓存。这个问题很郁闷啊,不能有评论我就手动重建啊,SK2 又不能关,只有动手改改了~这里说明下我的 PHP 水平是自己看了几天编程核心思想的书,然后受不了扔了,所以等级可想而知,如有各种离奇错误,还望指正。
首先研究了下 cos-html-cache 的代码,发现它在评论通过后更新缓存是靠 add_action 实现的,那么既然 SK2 通过评论后没有更新缓存,说明 SK2 通过评论后没有执行与 add_action 的钩子(hook)对应的 do_action(我的想法就是这样,并且根据这个思路解决了问题)。既然这样,我们只要在 SK2 通过评论的代码后加上一个 do_action 就应该可以解决问题。于是又着手研究 SK2 的代码,找到三处代码实现通过评论。下面说说修改方式:
首先编辑 spam_karma_2_plugin.php 文件,找到:
elseif ( get_settings('comments_notify'))
{
wp_notify_postauthor($comment_ID, $sk2_core->cur_comment->type);
}
这一好像是直接通过的评论不做任何处理,修改为:
else
{
if ( get_settings('comments_notify'))
{
wp_notify_postauthor($comment_ID, $sk2_core->cur_comment->type);
}
global $wpdb;$post_id = (int)$wpdb->get_var("SELECT comment_post_ID FROM $wpdb->comments WHERE comment_ID='$comment_ID' LIMIT 1");
do_action('comment_approved', $post_id);
}
可以看到,这里在通过后,获取通过评论所属文章的ID,平且 do_action。这里没有采用 cos-html-cache 处理评论时的 action(edit_post),主要是怕影响到其他由这个 action 激发的插件。
再找到:
if ($cur_section == 'spam')
{
$sk2_core->cur_comment->set_karma(15, 'web_UI', __("Manually recovered comment.", 'sk2'));
do_action('wp_set_comment_status', $sk2_core->cur_comment->ID);
}
这部分是手动将 spam 恢复为正常评论的代码,替换为:
if ($cur_section == 'spam')
{
$sk2_core->cur_comment->set_karma(15, 'web_UI', __("Manually recovered comment.", 'sk2'));
do_action('wp_set_comment_status', $sk2_core->cur_comment->ID);
global $wpdb;$post_id = (int)$wpdb->get_var("SELECT comment_post_ID FROM $wpdb->comments WHERE comment_ID='$sk2_core->cur_comment->ID' LIMIT 1");
do_action('comment_approved', $post_id);
}
到此 spam_karma_2_plugin.php 编辑完毕,保存,再开启 sk2_core_class.php,查找:
if ($this->cur_comment->approved == '1')
{
echo __("Thank you. Your comment has been approved.", 'sk2');
if ( get_settings('comments_notify') )
wp_notify_postauthor($this->cur_comment->ID, $this->cur_comment->type);
//TODO redirect to comment page...
}
这一段应该是给第二次机会后的处理,相应的替换为:
if ($this->cur_comment->approved == '1')
{
echo __("Thank you. Your comment has been approved.", 'sk2');
global $wpdb;$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', $post_id);
if ( get_settings('comments_notify') )
wp_notify_postauthor($this->cur_comment->ID, $this->cur_comment->type);
//TODO redirect to comment page...
}
至此 SK2 的改动完毕。前面已经说了,我写的 do_action 没有采用 cos-html-cache 处理评论时的 action,于是还要小改动一下 cos-html-cache 插件,开启 cos-html-cache.php,找到:
add_action('edit_post', 'htmlCreator');
add_action('edit_post', 'createIndexHTML');
在其下添加:
add_action('comment_approved', 'htmlCreator');
add_action('comment_approved', 'createIndexHTML');
到这里,所有的修改完毕,发布评论并被 SK2 通过后,应该就可以更新缓存了。
这次修改的思路就是在 SK2 里合适位置添加 do_action,使其在通过评论后触发 cos-html-cache 更新缓存。这种改法似乎可以用在更多场合,比如 FlickrRSS 图片更新后,亦可以通过类似的修改实现重新缓存首页什么的。

自己沙发下~
试一试ajax comments是否可用……
貌似是可以的,还就没有忙技术了,累……
貌似不即时显示,郁闷……
貌似是我看错了,呵呵……
不错,够勤快的,K2的处理也太不科学了
没有用过K2,不知道是什么情况……不行就手工加do_action……
刚才突然发现又不抓IP了,安家的缓存技术……
Ajax Comment里加了安家提供的代码就好了……
老王哦,好像你这边改版了,所以找了一番才找进来。发现你还是在做一些积极有意义的事,很好很好了,值得学习~~~
HELLO…我正在下你的YAIBA..超级开心的,找了N久啦..
我想问11集以后的有没有字幕的? 是什么字幕?
一定要回复我哦..期待中..也可以加我QQ112390972..
你的留言本用不了啊..所以写在这~
[...] 在他写的《SK2 与 cos-html-cache 共存之道》一文中给出了解决问题的思路和方法,即:在 SK2 [...]
[...] 其一:浪人的窝:SK 2 与 cos-html-cache 共存之道 [...]
Go there guys buy prescription medications that are used to relax your body, relax your muscles.