给WordPress添加访问排行榜的功能 – 涂雅 | 致力Web技术研究,关注互联网热点

给WordPress添加访问排行榜的功能


2010-8-30 09:00 wordpress 38个评论1313

阅读提示:阅读本文要求懂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-&gt;query('UPDATE wp_posts SET view_count =
			IFNULL(view_count, 0) + 1 WHERE ID = '. $postID);
			//添加一条访问记录
			$wpdb-&gt;query("INSERT INTO wp_stats(post_ID,view_date)
			 VALUES(".$postID.", utc_timestamp())");
			//写入到Cookies中去
			setcookie("StatsPost", $cook.$postID.",", time()+3600*12);
		}
 
	}
?>

这个代码主要是用于统计的,我接下来会在日志中添加一个Javascript文件引用,把文章的ID传过来,代码的工作内容大致如下:

  1. 判断文章IT是否为合法的ID
  2. 从Cookies读取用户已经访问过的文章ID列表,检查是否已经访问,如果已经访问则不再统计
  3. 检测wp_posts表中是否存在这个ID
  4. 如果存在,把wp_posts表的view_count字段加1,同时往wp_stats表中插入一条数据

第二部分是客户端的代码,这个代码很简单,加入一个Script代码就行。我们需要修改模版下的Single.php文件,在这个文件的底部添加:<script src=”/stat.php”></script>

排行榜

接下来我们要为博客添加排行榜的功能,数据是有统计了,如果不显示出来也没什么意议。

  1. 新建一个模版,模版名称为为排行榜。
  2. 在模版中添加如下代码:
    <?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>
  3. 上传模版,并在wordpress的后台中新建一个页面,页面的模版就选择榜行榜

经过这样处理之后你的博客就会有一个排行榜的功能了,我目前的排行榜包括24小时排行、30天排行、历史排行、最新文章,当然如果我要的话,还可以增加60天排行之类的,但我觉得没有必要。

说一下这种方式的问题,随你的访客越来越多,wp_stats表可能会越来越庞大,我的处理是当数据到一个量级之后,用sql把这个表group on到另一个表中去。一般来说,个人博客的访问量都比较低,所以很多人可以不用考虑这个问题,半年清一次也就差不多了。

我本来准备把这个功能搞成一个插件的,但觉得会费太多的事,因为插件还要考虑很多东西,所以先将代码放出来,有需要的朋友可以用到。

2010-9-1注:找到一个同样功能的插件,我还没有试,不过从介绍看应该功能是一样的,还拥有更多的功能,地址:http://wordpress.org/extend/plugins/stats/

无觅相关文章插件,快速提升流量

嗯,或者你也可以收听我的微博,腾讯微博(主要用这个,其他的看我的个人介绍)

我写博客常常出现错别字,常常错得还很离谱,有时候我自己看了第二遍都骂我自个儿,但我又不习惯重复审查,纠结啊...各位看到啥错别字或者不明白的地方,请给我留言指出来,感谢感谢。

  

  • 38个评论在 "给WordPress添加访问排行榜的功能"

  • 百毒博客
    2011-4-3 17:33
    回复TA

    我个人比较喜欢使用插件,我认为有插件,就使用插件,如果自己修改数据库,很可能会弄乱。

  • 肖俊
    2011-2-9 15:31
    回复TA

    虽然用过WP博客,但对此很惭愧,表示看不懂。

  • WordPress啦
    2010-10-19 15:28
    回复TA

    打算学习下的,完全看不懂。

    • 涂雅
      2010-10-19 20:25
      回复TA

      呵呵,作为wordpress.la的webmaster,居然看不懂 :p
      不过貌似很多站长都不是程序员出身

  • general
    2010-10-19 13:14
    回复TA

    看天书啊!!啊………………

  • surda
    2010-9-14 17:31
    回复TA

    榜排版看起来很舒服

  • cowman
    2010-9-8 14:01
    回复TA

    希望博主能够写一篇用免费空间+WordPress建blog的教程
    总是看着博主说道WordPress,手痒痒了
    可是对WordPress基本没一点概念
    还希望博主能点拨下~~
    感谢凼,感谢郭嘉,感谢博主~

    • 涂雅
      2010-9-9 16:54
      回复TA

      其实这种东东网上很多很多很多,真的,你找找google吧。我觉得我实在没有必要做重复的劳动了吧

  • cowman
    2010-9-8 14:00
    回复TA

    希望博主能够写一篇用免费空间+WordPress建blog的教程
    总是看着博主说道WordPress,手痒痒了
    可是对WordPress基本没一点概念
    还希望博主能点拨下~~

  • 风雅联盟博客
    2010-9-4 23:00
    回复TA

    偶不懂代码,不过还是很感谢楼主分享的。不过你这样做影响网站运行速度吗?

  • 绍兴seo
    2010-9-3 09:45
    回复TA

    wordpress菜鸟一个,对于wp使用还在学习中,更别说修改程序了。哈哈。

  • Xshagua
    2010-9-1 22:15
    回复TA

    插件绝对支持!数据库修改教程也行!

    • 涂雅
      2010-9-1 22:49
      回复TA

      数据库你直接用那个sql执行就ok了
      插件我后面给的链接也可以,我没试过,不过看说明应该功能差不多。
      既然有,我就不写同样的插件了

  • 小马过河
    2010-9-1 20:53
    回复TA

    这个主题挺漂亮的 :)

    • 涂雅
      2010-9-1 21:22
      回复TA

      嘿嘿,大家都这么说,看来搞it的人都喜欢这个主题啊

  • 学夫子
    2010-9-1 20:43
    回复TA

    你搬回来了,我把我的主机又搬到韩国去了……

    • 涂雅
      2010-9-1 21:23
      回复TA

      韩国不太好,我马上要回到国内了,备案办好了

      • Xshagua
        2010-9-1 22:09
        回复TA

        厉害,个人备案也会成功!

        • 涂雅
          2010-9-1 22:47
          回复TA

          icp备谁都可以办的,不过麻烦些

        • 冬瓜炒木耳
          2010-9-17 19:48
          回复TA

          我六月份备的案,感觉一切顺利,用的是国内的免费空间,自己在网上提交办理的备案,很意外,竟然一次成功。

  • 如何瘦脸
    2010-8-31 22:11
    回复TA

    新主题比原来的漂亮多了

  • Xshagua
    2010-8-31 08:44
    回复TA

    杯具啊!就是不会弄数据库,可惜了!先收个书签吧~

    • 涂雅
      2010-8-31 10:13
      回复TA

      希望我有时间做成一个插件,哈

  • anyLiv
    2010-8-30 17:22
    回复TA

    新模板看起来非常漂亮!

  • 丕子
    2010-8-30 14:02
    回复TA

    是不是原来数据表中有访问统计的字段?

    • 涂雅
      2010-8-30 14:26
      回复TA

      有,要去另一个表,我觉得这样效率不高

  • 囧啊囧
    2010-8-30 13:30
    回复TA

    还要修改数据库,我更加愿意等你插件。

    • 涂雅
      2010-8-30 13:37
      回复TA

      插件不知道猴年马月才出来,做插件太麻烦了,我以前那个wp_markKeyword费了我不少时间。
      这个插件要搞的话,估计怎么也得一周时间吧。

    • 涂雅
      2010-8-30 13:38
      回复TA

      嘿,大家对这个插件有兴趣没有

  • ifenwen
    2010-8-30 13:03
    回复TA

    果然不错啊 只是要改数据库 没有尝试过~

    • 涂雅
      2010-8-30 13:38
      回复TA

      貌似对一般用户是麻烦着点

  • 旅行者2号
    2010-8-30 12:00
    回复TA

    总算换程序了,总算可以轻松留言了

    • 涂雅
      2010-8-30 12:03
      回复TA

      哈哈,以前留言这么恐怖啊,我觉得和服务器有关,特别慢。
      不过用户体验确实有些地方不太好

  • LOKE
    2010-8-30 09:47
    回复TA

    新主题比原来的漂亮多了!超级赞!!

    • 涂雅
      2010-8-30 10:05
      回复TA

      哈哈,看来以前主题令人诟病啊

  • 评论敬告那些为做SEO而评论的朋友,本博不欢迎此类评论,请不要利用本博做关键字,一律封杀。

    绝不跨省追捕
    不会发垃圾邮件
    增加你的流量