给wp-related-posts增加类目相关日志

12月 5th, 2010 2,118 留下评论 阅读评论

wp-related-posts是国人水煮鱼开发的一个十分赞的插件,它在文章页面增加显示与当前文章的tag相同的其他文章的链接,推荐给读者,当没有tag(标签)相关文章时,它随机选择文章推荐,而且在RSS中也有效果。有点不认同作者逻辑的是为啥选择tag相关呢?所以我很多的文章都只能随机推荐文章,或者推荐1-2篇tag相关文章,其实类目相关才是更加明显而且每篇文章都会有一个显然的类目,而不一定有tag。于是自己动手,丰衣足食咯 :roll:

由于tag、类目涉及了wordpress3个数据表,结构比较复杂,先简单解释一下wp_posts、wp_term_relationships、wp_term_taxonomy和wp_terms的关系,它们分别为文章内容表、文章对应的term表、term与term类型表、term表,其中term包括tag、文章类目、链接类目、链接项等。它们之间的关系如下图:

wp_tables

一篇文章,有一个在wp_posts中的ID,然后在wp_term_relationships表中可以找到若干项terms(包括文章的类别和tags),然后在wp_term_taxonomy表中可以找到这些terms的类型说明和term_id,然后根据term_id在wp_terms表中找到term的名字。

好了接下去就是修改wp-related-posts了:

  • 修改链接属性target为_blank
1
2
3
4
5
6
7
function wp_get_related_posts(......){
      foreach ($related_posts as $related_post ){
            ......
            $output .=  '<a target="_blank" href="'.get_permalink($related_post->ID).  ......
            ......
      }
}
  • 增加文章类目相关

新增函数function wp_get_related_catgory_posts($content),首先用get_the_category()这个wordpress内置的函数获取将类目包装的一个数组,处理后获取到$cat_id_list就可去数据库找相关的文章了。

1
2
3
4
5
6
$q = "SELECT p.ID, p.post_title, p.post_date, count(t_r.object_id) as cnt
      FROM $wpdb->term_taxonomy t_t, $wpdb->term_relationships t_r, $wpdb->posts p
      WHERE t_t.taxonomy ='category' AND t_t.term_taxonomy_id = t_r.term_taxonomy_id
      AND t_r.object_id  = p.ID AND (t_t.term_id IN ($cat_id_list)) AND p.ID != $post->ID
      AND p.post_status = 'publish' AND p.post_date_gmt < '$now'
      GROUP BY t_r.object_id ORDER BY cnt DESC, p.post_date_gmt DESC $limitclause;";

用这句巨长的sql语句查出相关文章的记录后,剩下的就是将内容拼接为HTML罢了,其中用到内置函数get_permalink($related_post->ID)来获取文章自定义的URL,基本就没啥了。

最后修改调用的函数,有2部分,文章显示和RSS显示的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function wp_related_posts(){
	$output = wp_get_related_posts() ;
 
	//add by stariy --start
	$output = wp_get_related_catgory_posts($output) ;
	//add by stariy --end
 
	echo $output;
}
 
function wp_related_posts_auto($content){
	$wp_rp = get_option("wp_rp");
	if ((is_single() && $wp_rp["wp_rp_auto"])||(is_feed() && $wp_rp["wp_rp_rss"])) {
		$output = wp_get_related_posts();
 
		//add by stariy --start
		$output = wp_get_related_catgory_posts($output);
		//add by stariy --end
 
		$content = $content . $output;
	}
	return $content;
}

这样就大功告成啦,感觉效果还不错,对原来插件代码的修改也是尽可能的少,基本就增加了一个新的函数。然后试用后发现唯一的缺点是,当你的类目相关和tag相关文章重复,这就是比较尴尬的问题了,由于我是另起一个函数处理类目相关,与tag相关的处理是独立的,要解决这个问题十分麻烦。不过万幸的是,发现这种现象出现的很少,基本类目信息和tag信息是不太一样的,但如果你硬把一篇文章归位Java类,然后tag再来个Java,那就悲剧了…

源代码就发布在这个增强的wp-related-posts插件里吧

wp-related-posts-enhanced.zip

Categories: Wordpress 标签:,
  1. 还没有评论呢。