替换wp-postviews,沿用老数据实现计数与排行

本来想记录下BUG的处理,但改了下当做问题记录吧,文章计数BUG修复了!

在前一段时间合并插件的时候不知道弄了哪里,统计失效了,当时也发现了,然后又因为没时间来处理这个BUG一直拖着。今天解决了这个问题,统计重新开始工作,同时要说明的是在使用主题的朋友不用担心有这个BUG,因为给出的主题包是不含有这个问题的,这个问题是我自己使用中修改测试一些东西出现的。

顺便记一下一个wordpress替换wp-postviews插件,改为纯代码实现,同时继续保存之前的统计数据,显示文章排行的代码:

// 文章阅读统计,放在functions.php里 
function getPostViews($postID,$isRelated=false){ 
$count_key = 'views'; 
$count = get_post_meta($postID, $count_key, true); 
if(''==$count){ 
delete_post_meta($postID, $count_key); 
add_post_meta($postID, $count_key, '0'); 
} 
if($isRelated){ 
echo $count.' +'; 
}else{ 
if(0==$count){ 
echo "被围观0次"; 
}else{ 
echo '被围观'.$count.'次'; 
} 
} 
} 
function setPostViews($postID) { 
$count_key = 'views'; 
$count = get_post_meta($postID, $count_key, true); 
if(''==$count){ 
$count = 0; 
delete_post_meta($postID, $count_key); 
add_post_meta($postID, $count_key, '0'); 
}else{ 
$count++; 
update_post_meta($postID, $count_key, $count); 
} 
}

然后将如下统计和设置的函数放入到主题文件single.php的the_post()函数后面:


在你想实现文章阅读次数的地方可以放入下面代码:


如果想让浏览统计数字像WP-Postviews 插件一样会每3位加一个“,”号,例如“1,234”,那么就把此段代码改为:


如果要在后台文章列表显示文章阅读次数,那就继续加入:

add_filter('manage_posts_columns', 'posts_column_views'); 
add_action('manage_posts_custom_column', 'posts_custom_column_views',5,2); 
function posts_column_views($defaults){ 
$defaults['post_views'] = __('Views'); 
return $defaults; 
} 
function posts_custom_column_views($column_name, $id){ 
if($column_name === 'post_views'){ 
echo getPostViews(get_the_ID(),true); 
} 
}

使用此方法实现文章统计排行

//热门文章排行,同时放在functions.php里
function the_most_views($days=0){ 
global $wpdb, $post; 
if(0!=$days){ 
$limit_date = current_time('timestamp') - ($days*86400); 
$limit_date = date("Y-m-d H:i:s",$limit_date); 
$most_viewed = $wpdb->get_results("SELECT ID,post_title,post_date,post_status,post_id,meta_key,meta_value FROM $wpdb->posts,$wpdb->postmeta where $wpdb->posts.ID=$wpdb->postmeta.post_id AND post_date < '".current_time('mysql')."' AND post_date > '".$limit_date."' AND post_status = 'publish' AND $wpdb->postmeta.meta_key='views' ORDER BY CAST($wpdb->postmeta.meta_value as SIGNED) DESC LIMIT 10"); 
}else{ 
$most_viewed = $wpdb->get_results("SELECT ID,post_title,post_date,post_status,post_id,meta_key,meta_value FROM $wpdb->posts,$wpdb->postmeta where $wpdb->postmeta.meta_key='views' AND $wpdb->posts.ID=$wpdb->postmeta.post_id AND $wpdb->posts.post_status = 'publish' ORDER BY CAST($wpdb->postmeta.meta_value as SIGNED) DESC LIMIT 10"); 
} 
if($most_viewed){ 
foreach ($most_viewed as $views) { 
echo '
  • '; echo 'ID).'" rel="bookmark">'.$views->post_title.''; echo '
  • '; } }else{ echo '
  • 当前设置没有文章可以显示。
  • '; } }

    在需要显示热门文章的地方调用:

    
    

    里面的参数$days=0时是所有文章排行,30天的话就是月排行了,180当然就是半年排行了,结束!