通过文章访问统计插件 WP-PostViews Plus 或者 WP-PostViews,Wordpress都能显示热门文章,可惜这两个插件总有那么一些问题。所以 LD干脆自己写了一个简单PHP函数,通过判断文章留言数,显示热门文章。

函数调用很简单,只要在WP皮肤文件 sidebar.php中加入代码即可。其中函数 simple_get_most_viewed(7, 31); 有两个参数, 第一个是要显示的文章数,第二个是时间段,默认最近一个月。

<h4>当月热门</h4>
<ul>
<?php if (function_exists('simple_get_most_viewed')) { simple_get_most_viewed(7, 31); } ?>
</ul>

函数代码(加入 function.php 文件中):

// 获得热评文章
function simple_get_most_viewed($posts_num=10, $days=30){
	global $wpdb;

	$sql = "SELECT `ID` , `post_title` , `comment_count` FROM $wpdb->posts
			WHERE `post_type` = 'post' AND TO_DAYS( now( ) ) - TO_DAYS( `post_date` ) < $days
			ORDER BY `comment_count` DESC LIMIT 0 , $posts_num ";

	$posts = $wpdb->get_results($sql);
	$output = "";
	foreach ($posts as $post){
		$output .= "\n<li><a href= \"".get_permalink($post->ID)."\" rel=\"bookmark\" title=\"".$post->post_title."\" >".$post->post_title."</a> - ".$post->comment_count."个评论</li>";
	}
	echo $output;
}
// 函数 get_permalink($post->ID) 可以得到文章的URL

其实有用的语句只是一句SQL语句:

SELECT `ID` , `post_title` , `comment_count` FROM $wpdb->posts
			WHERE `post_type` = 'post' AND TO_DAYS( now( ) ) - TO_DAYS( `post_date` ) < $days
			ORDER BY `comment_count` DESC LIMIT 0 , $posts_num

废话不多说,下面我写几个原版的SQL语句,如果需要修改函数功能,可以参考:

  1. 查找所有的日志,得到留言最多的10篇, 降序排列:
    SELECT `ID` , `post_title` , `comment_count`
    			FROM `wp_posts` WHERE `post_type` = 'post'
    			ORDER BY `comment_count` DESC LIMIT 0 , 10
    

    如果不加判断 `post_type` = ‘post’ ,则得到的包括页面。

  2. 查找最近一个月的日志,得到留言最多的10篇:
    SELECT `ID` , `post_title` , `comment_count`  FROM `wp_posts`
    			WHERE `post_type` = 'post'  AND TO_DAYS( now( ) ) - TO_DAYS( `post_date` ) < 31
    			ORDER BY `comment_count` DESC LIMIT 0 , 10
    
  3. 查找所有作者ID为 2, 且已经发表的日志,得到留言最多的10篇:
    SELECT `ID` , `post_title` , `comment_count`  FROM `wp_posts`
    			WHERE `post_type` = 'post'
    			AND `post_status` = 'publish'
    			AND `post_author` = 2
    			ORDER BY `comment_count` DESC LIMIT 0 , 10
    
  4. 查找所有分类ID为 3 的日志,得到留言最多的10篇:
    SELECT `ID` , `post_title` , `comment_count`  FROM `wp_posts`
    	INNER JOIN `wp_term_relationships` ON (`wp_posts`.`ID` = `wp_term_relationships`.`object_id`)
    	INNER JOIN `wp_term_taxonomy` ON (`wp_term_relationships`.`term_taxonomy_id` =  `wp_term_taxonomy`.`term_taxonomy_id`)
     	WHERE   1=1
    		AND `wp_term_taxonomy`.`taxonomy` = 'category'
    		AND `wp_term_taxonomy`.`term_id` = 3
    		AND `wp_posts`.`post_type` = 'post'
    	GROUP BY `wp_posts`.`ID`
    	ORDER BY `comment_count` DESC LIMIT 0 , 10