阅读提示:阅读本文要求懂PHP或者相关的开发者。
好久不写技术类的文章了,这两天我又把博客换回来了,博客又从韩国换回到了Godaddy,因为最近韩国服务开始不稳定了,Godaddy貌似好一些了。感谢郭嘉,感谢功夫网,感谢方滨兴,让我从美国到韩国又回到美国。趁机会把博客又小搞了一下,这次完全换成PHP了,也换了一个模版,自己觉得这个模版还不错,估计搞技术的人会比较喜欢。最看重的是这个模版很轻巧,没有使用jQuery,首页体积经过压缩后只有60k不到(不包括Google等三方的Javascript代码)。
之前我曾经花几天给Wordpress增加了一个拦截器,优点是访问速度变快了,缺点是许多Wordpress的功能不能使用了,评论也有些美中不足。这次又改造了一下Wordpress,基本上使用了WP原生功能,但在模版与WP上都做了一些改进。插件我只使用了4个,分别是Akismet、cos-html-cache、Google XML Sitemaps、WP-Syntax,可以通过简单修改程序达到的功能,一率不用插件。因为插件太消耗资源了,特别是在虚拟主机上运行的时候,以前就是一个wp_simpleTag把我的博客搞死了。
除了插件上,还保留了原来的排行榜的功能,这个功能觉得还不错的,所以今天把这个功能的经验分享出来。可能会有人说我喜欢倒腾,没办法,搞技术的人就是这样,你可以把我当成一个Geek就行了,比如说玩Linux的人也比较爱倒腾。
修改数据库
首先应该修改数据库,你需要创建一个统计表,字段很简单,只有文章、日期、主键而已,如下:
CREATE TABLE `wp_stats` ( `stats_ID` int(11) NOT NULL AUTO_INCREMENT, `post_ID` int(11) NOT NULL COMMENT '文章的id', `view_date` datetime DEFAULT NULL COMMENT '访问时间', PRIMARY KEY (`stats_ID`) ) ENGINE=InnoDB AUTO_INCREMENT=98898 DEFAULT CHARSET=utf8;
对于访问量的统计,有一个叫wp_postViews的插件可以使用,但是我还是觉得直接添加一个字段来记录访问量,如果你不需要访问量的数据,可能忽略此步,代码如下:
ALTER TABLE wp_posts ADD view_count INT DEFAULT '0';
添加统计代码
我设置的统计原则是同一电脑在24小时访问才进行计数,统计代码分为两个部分,第一部分是服务器端的php代码,我们在blog的根目录下添加一个stat.php的文件,代码如下:
<?php get_results( "SELECT ID FROM wp_posts WHERE post_status = 'publish' AND post_type = 'POST' AND ID = ". $postID); //数据库中存在这篇文章 if(count($myrows) != 0){ //更新文章的访问量 $wpdb->query('UPDATE wp_posts SET view_count = IFNULL(view_count, 0) + 1 WHERE ID = '. $postID); //添加一条访问记录 $wpdb->query("INSERT INTO wp_stats(post_ID,view_date) VALUES(".$postID.", utc_timestamp())"); //写入到Cookies中去 setcookie("StatsPost", $cook.$postID.",", time()+3600*12); } } ?>
这个代码主要是用于统计的,我接下来会在日志中添加一个Javascript文件引用,把文章的ID传过来,代码的工作内容大致如下:
- 判断文章IT是否为合法的ID
- 从Cookies读取用户已经访问过的文章ID列表,检查是否已经访问,如果已经访问则不再统计
- 检测wp_posts表中是否存在这个ID
- 如果存在,把wp_posts表的view_count字段加1,同时往wp_stats表中插入一条数据
第二部分是客户端的代码,这个代码很简单,加入一个Script代码就行。我们需要修改模版下的Single.php文件,在这个文件的底部添加:<script src=”/stat.php”></script>
排行榜
接下来我们要为博客添加排行榜的功能,数据是有统计了,如果不显示出来也没什么意议。
- 新建一个模版,模版名称为为排行榜。
- 在模版中添加如下代码:
<?php function postList($sql, $title, $showDate = true) { global $wpdb; echo '<ul><li class="caption"><h3>'.$title.'</h3></li>'; $rows = $wpdb->get_results($sql); foreach ($rows as $row) { echo '<li title="发表于:'.$row->Date.' 访问:'.$row->ViewCount.'"> <a href="/archives/'.$row->ID.'.html">'; echo $row->Title; /*if($showDate){ echo '<span class="date">'; $unit; $count; var span = time() - $row->Date; if(span <= 600){ $unit = "分钟"; $count = round(span / 60); }elseif(span <= 2 * 24 * 60 * 60){ $unit = "小时"; $count = round(span / 60 / 60, 1); }elseif(span <= 10 * 24 * 60 * 60){ $unit = "天"; $count = round(span / 60 / 60, 2); }else{ $unit = ""; $count = date("'Y-n-j H:i'",$row->Date); } echo $count.$unit; }else { echo '<span class="count">'; echo $row->ViewCount; }*/ echo '<span class="count">'; echo $row->ViewCount; echo '</span>'; echo '</a>'; //echo '<br /><span class="date">'.date('Y-n-j H:i', strtotime($row->Date)).'</span>'; //echo '<span class="view">访问:'.$row->ViewCount.'</span>'; echo '</li>'; } echo '</ul>'; } $viewSql = "SELECT B.ID,A.ViewCount, convert_tz(post_date_gmt, '+00:00', '+8:00') Date, post_title Title, comment_count CommentCount FROM (SELECT COUNT(*) ViewCount, post_ID FROM wp_stats WHERE time_to_sec(timediff(utc_timestamp(), view_date)) < {0} GROUP BY post_ID ORDER BY COUNT(*) DESC LIMIT 0, 10) A LEFT JOIN wp_posts B ON A.post_ID = B.ID ORDER BY ViewCount DESC,post_date_gmt DESC"; $postSql = "SELECT ID,view_count ViewCount, convert_tz(post_date_gmt, '+00:00', '+8:00') Date, post_title Title, comment_count CommentCount FROM wp_posts WHERE post_status = 'publish' AND post_type = 'POST' ORDER BY {0}post_date_gmt DESC LIMIT 0, 10"; ?> <div class="post clear"> <h2 class="entry-title hot">爬行榜</h2> <ul class="hotPost"> <?php echo '<li class="frame">'; //获取最新文章 postList(str_replace('{0}', '', $postSql), '最新文章', true); //24小时排行 postList(str_replace('{0}', '86400', $viewSql), '24小时排行', false); echo '</li><li class="frame">'; //30天排行 postList(str_replace('{0}', '2592000', $viewSql), '30天排行', false); //获取历史排行 postList(str_replace('{0}', 'ViewCount DESC,', $postSql), '历史排行榜', false); echo '</li>'; //获取评论最多的 ?> </ul> </div>
- 上传模版,并在wordpress的后台中新建一个页面,页面的模版就选择榜行榜
经过这样处理之后你的博客就会有一个排行榜的功能了,我目前的排行榜包括24小时排行、30天排行、历史排行、最新文章,当然如果我要的话,还可以增加60天排行之类的,但我觉得没有必要。
说一下这种方式的问题,随你的访客越来越多,wp_stats表可能会越来越庞大,我的处理是当数据到一个量级之后,用sql把这个表group on到另一个表中去。一般来说,个人博客的访问量都比较低,所以很多人可以不用考虑这个问题,半年清一次也就差不多了。
我本来准备把这个功能搞成一个插件的,但觉得会费太多的事,因为插件还要考虑很多东西,所以先将代码放出来,有需要的朋友可以用到。
2010-9-1注:找到一个同样功能的插件,我还没有试,不过从介绍看应该功能是一样的,还拥有更多的功能,地址:http://wordpress.org/extend/plugins/stats/
本文来自涂雅[http://iove.net/],原文链接:http://iove.net/archives/2785.html,网站转载请注明来源于涂雅并保留原文链接,否则视为侵权。
嗯,或者你也可以收听我的微博,腾讯微博(主要用这个,其他的看我的个人介绍)
我写博客常常出现错别字,常常错得还很离谱,有时候我自己看了第二遍都骂我自个儿,但我又不习惯重复审查,纠结啊...各位看到啥错别字或者不明白的地方,请给我留言指出来,感谢感谢。
gmail.com
38个评论在 "给WordPress添加访问排行榜的功能"
2011-4-3 17:33
我个人比较喜欢使用插件,我认为有插件,就使用插件,如果自己修改数据库,很可能会弄乱。
2011-2-9 15:31
虽然用过WP博客,但对此很惭愧,表示看不懂。
2010-10-19 15:28
打算学习下的,完全看不懂。
2010-10-19 20:25
呵呵,作为wordpress.la的webmaster,居然看不懂 :p
不过貌似很多站长都不是程序员出身
2010-10-19 13:14
看天书啊!!啊………………
2010-9-14 17:31
榜排版看起来很舒服
2010-9-8 14:01
希望博主能够写一篇用免费空间+WordPress建blog的教程
总是看着博主说道WordPress,手痒痒了
可是对WordPress基本没一点概念
还希望博主能点拨下~~
感谢凼,感谢郭嘉,感谢博主~
2010-9-9 16:54
其实这种东东网上很多很多很多,真的,你找找google吧。我觉得我实在没有必要做重复的劳动了吧
2010-9-8 14:00
希望博主能够写一篇用免费空间+WordPress建blog的教程
总是看着博主说道WordPress,手痒痒了
可是对WordPress基本没一点概念
还希望博主能点拨下~~
2010-9-4 23:00
偶不懂代码,不过还是很感谢楼主分享的。不过你这样做影响网站运行速度吗?
2010-9-5 00:14
对速度几乎没有影响
2010-9-3 09:45
wordpress菜鸟一个,对于wp使用还在学习中,更别说修改程序了。哈哈。
2010-9-3 10:17
哈哈,菜鸟也会长大的
2010-9-1 22:15
插件绝对支持!数据库修改教程也行!
2010-9-1 22:49
数据库你直接用那个sql执行就ok了
插件我后面给的链接也可以,我没试过,不过看说明应该功能差不多。
既然有,我就不写同样的插件了
2010-9-1 20:53
这个主题挺漂亮的
2010-9-1 21:22
嘿嘿,大家都这么说,看来搞it的人都喜欢这个主题啊
2010-9-1 20:43
你搬回来了,我把我的主机又搬到韩国去了……
2010-9-1 21:23
韩国不太好,我马上要回到国内了,备案办好了
2010-9-1 22:09
厉害,个人备案也会成功!
2010-9-1 22:47
icp备谁都可以办的,不过麻烦些
2010-9-17 19:48
我六月份备的案,感觉一切顺利,用的是国内的免费空间,自己在网上提交办理的备案,很意外,竟然一次成功。
2010-8-31 22:11
新主题比原来的漂亮多了
2010-8-31 08:44
杯具啊!就是不会弄数据库,可惜了!先收个书签吧~
2010-8-31 10:13
希望我有时间做成一个插件,哈
2010-8-30 17:22
新模板看起来非常漂亮!
2010-8-30 14:02
是不是原来数据表中有访问统计的字段?
2010-8-30 14:26
有,要去另一个表,我觉得这样效率不高
2010-8-30 13:30
还要修改数据库,我更加愿意等你插件。
2010-8-30 13:37
插件不知道猴年马月才出来,做插件太麻烦了,我以前那个wp_markKeyword费了我不少时间。
这个插件要搞的话,估计怎么也得一周时间吧。
2010-8-30 13:38
嘿,大家对这个插件有兴趣没有
2010-8-30 22:03
有
2010-8-30 13:03
果然不错啊 只是要改数据库 没有尝试过~
2010-8-30 13:38
貌似对一般用户是麻烦着点
2010-8-30 12:00
总算换程序了,总算可以轻松留言了
2010-8-30 12:03
哈哈,以前留言这么恐怖啊,我觉得和服务器有关,特别慢。
不过用户体验确实有些地方不太好
2010-8-30 09:47
新主题比原来的漂亮多了!超级赞!!
2010-8-30 10:05
哈哈,看来以前主题令人诟病啊