WordPress Related Posts 这个插件已经被下载了2万多次。但是个人对这个插件一直有一个不满意的地方,那就是效率不是很高。我在我的 Bluehost 空间安装这个插件的时候,几次因为这个插件 SLOW SQL 搞的 CPU 超限而被 Suspend 了几分钟,狂晕。 是的,这个插件是使用了一条效率很低的 SQL,因为根据 Tag 来查找相关日至要对所有的 Post 扫一便,看看是不是有相同的 Tag。我想了很久,还是没有想到效率更高的缓存,大学的时候 SQL 还是学得不错,但是现在基本都不懂了,汗!既然没有想到效率更高的 SQL,我想到的第二个方法是缓存,第一个方法是可以使用 WordPress 对象缓存,但是 WordPress 2.5 已经全部采用内存缓存而舍弃了文件缓存,如果主机没有安装内存缓存模块,基本没用,当然也可以是用高级缓存插件,如:WordPress Super Cache。不过我这里使用的是 PostMeta 来缓存。
我们知道,PostMeta 表是用来存储 Post 其他自定义字段,比如你可以在 WordPress 编辑界面自定义字段那里使用它。那么我可以把当前日志的相关日志列表写到 PostMeta 中去,并记录写入的时间。然后再取出,就可以达到加速的效果。具体代码如如下:
代码语言:javascript复制<?php
global $id;
$output_old = get_post_meta($id, "related_posts", $single = true); // 从 postmeta 表中获取缓存的相关日志
if($output_old){ //如果返回结果不为空
$time = time();
if(($time - $output_old["time"])<600){ //并且在缓存的时间以内(600秒)
echo $output_old["related_posts"];
}
}else{
$output = wp_get_related_posts() ; //获取相关日志
$output_new = array("time"=>time(),"related_posts"=>$output);
if($output_old){//如果 postmeta 中已有记录,更新
update_post_meta($id, 'related_posts', $output_new);
}else{ //否则,新插入
add_post_meta($id, 'related_posts', $output_new, true);
}
echo $output;
}
?>
当然了,这样缓存也有点不好,就是相关后台配置修改要一段时间才能体现出来。