给wp-related-posts增加类目相关日志
wp-related-posts是国人水煮鱼开发的一个十分赞的插件,它在文章页面增加显示与当前文章的tag相同的其他文章的链接,推荐给读者,当没有tag(标签)相关文章时,它随机选择文章推荐,而且在RSS中也有效果。有点不认同作者逻辑的是为啥选择tag相关呢?所以我很多的文章都只能随机推荐文章,或者推荐1-2篇tag相关文章,其实类目相关才是更加明显而且每篇文章都会有一个显然的类目,而不一定有tag。于是自己动手,丰衣足食咯
由于tag、类目涉及了wordpress3个数据表,结构比较复杂,先简单解释一下wp_posts、wp_term_relationships、wp_term_taxonomy和wp_terms的关系,它们分别为文章内容表、文章对应的term表、term与term类型表、term表,其中term包括tag、文章类目、链接类目、链接项等。它们之间的关系如下图:
一篇文章,有一个在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插件里吧