不用插件实现相关日志的两种方法

  • 2010-10-06
  • 570
  • 0
  • 0

诺诺的目标就是让自己的博客少用甚至不用插件,所以想尽办法折腾去掉一些插件。用了以下代码之后,洋葱彻底把 WordPress 2.3 Related Posts Plugin 插件删了。

一种是可以在单篇日志和feed 中都生成相关日志,不过,功能越强大,代码也就会相应较多,所以这里还提供第二种,仅在单篇日志中实现在相关日志的方法。大家各取所需吧:

方法一:单篇日志和 feed 中都可以生成相关日志。

此方法参考自荒野无灯的,可以设置的参数很多,也相当之强大。不过我还是嫌代码太多,所以根据自己的需要再一次精简压缩了一下,总结如下:

把以下代码复制到 WordPress 的主题文件 functions.php 中:

  1. function wp_get_related_posts()
  2. {
  3.  global $wpdb$post,$table_prefix;
  4. $limit = 10; //显示几条相关文章
  5. if(!$post->ID){return;}
  6. $now = current_time(‘mysql’, 1);
  7. $tags = wp_get_post_tags($post->ID);
  8. $taglist = “‘” . $tags[0]->term_id. “‘”;
  9. $tagcount = count($tags);
  10. if ($tagcount > 1) {
  11.     for ($i = 1; $i < $tagcount$i++) {
  12.         $taglist = $taglist . “, ‘” . $tags[$i]->term_id . “‘”;
  13.     }
  14. }
  15.     $limitclause = “LIMIT $limit”;
  16. $q = “SELECT p.ID, p.post_title, p.post_date,  p.comment_count, 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 =’post_tag’ AND t_t.term_taxonomy_id = t_r.term_taxonomy_id AND t_r.object_id  = p.ID AND (t_t.term_id IN ($taglist)) 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;”;
  17. $related_posts = $wpdb->get_results($q);
  18. $output = “”;
  19. if (!$related_posts)
  20. {
  21.     $output  .= ‘<li>无相关日志</li>’;
  22. }
  23. foreach ($related_posts as $related_post )
  24. {
  25.     $dateformat = get_option(‘date_format’);
  26.     $output .= ‘<li>’;
  27.     $output .=  ‘<a href=“‘.get_permalink($related_post->ID).'” title=“‘.wptexturize($related_post->post_title).’ (‘.mysql2date($dateformat, $related_post->post_date).’)”>’.wptexturize($related_post->post_title).'</a> (‘. $related_post->comment_count .’)’;
  28.     $output .=  ‘</li>’;
  29. }

方法二:仅在单篇日志中显示相关日志。

洋葱有代码洁癖,看到方法一那么庞大的代码,索性只在单篇日志中插件相关文章,就是下面这种方法了。在 WordPress 主题文件 single.php 中需要的位置插入以下代码即可:

  1. <h3>相关日志</h3>
  2. <ul>
  3. <?php
  4. $tags = wp_get_post_tags($post->ID);
  5. if ($tags) {
  6. $first_tag = $tags[0]->term_id;
  7. $args=array(
  8. ‘tag__in’ => array($first_tag),
  9. ‘post__not_in’ => array($post->ID),
  10. ‘showposts’=>10,
  11. ‘caller_get_posts’=>1
  12. );
  13. $my_query = new WP_Query($args);
  14. if$my_query->have_posts() ) {
  15. while ($my_query->have_posts()) : $my_query->the_post(); ?>
  16. <li><a href=“<?php the_permalink() ?>” rel=“bookmark” title=“<?php the_title_attribute(); ?>”><?php the_title();?> <?php comments_number(‘ ‘,'(1)’,'(%)’); ?></a></li>
  17. <?php
  18. endwhile;
  19. }
  20. }
  21. wp_reset_query();
  22. ?>
  23. </ul>

至于这两个方法实现的文章的相关度,大家可以放心,因为都是以标签为数组获取的相关文章,相关度还是很高的,和插件实现的一样,效果就请见我日志页中的相关日志吧。终于又少了一个插件,争取零插件!哈哈~

参考文章:万戈——WordPress 非插件相关日志的两种方法

评论

还没有任何评论,你来说两句吧

发表评论