有的时候需要对自己博客内的东西的下载次数进行统计:

  • 使用插件,比如 WP-DownloadManager。
  • 使用短网址服务,比如国外的 goo.gl, bit.ly 都提供了短网址的跳转次数和来路等等详细信息的记录。

不过仅仅是简单的统计用插件显得有点儿大材小用;短网址嘛,身在景德镇,无形的长城使得这些服务的稳定性不能保证。所以还是自己实现一个简单的下载次数统计吧:实际上就是利用以下的 PHP 文件做跳板,每当链接点击后对数据库进行操作,相应文件的下载次数加一,再跳转到真实文件的地址,产生下载行为,和大部分下载站的方式是一样的。虽然目前还不太完善吧,功能实现还是没问题的~

把下面这个代码存为dl.php放到网站的根目录(和 WordPress 根目录同级)。

<?php
 
//博客的首页地址,无需 http://
$blogURL = 'example.com';
 
//包含 WP 文件,声明 wpdb 全局变量
include_once('wp-config.php');
include_once('wp-includes/wp-db.php');
global $wpdb;
 
//获取文件地址参数
$fileURI = $_GET['file'];
//获取文件名,如何防止 SQL 注入还请高手指教
$filename = preg_replace("/.*\/(.*)/",'$1',$fileURI);
//获取文件的相对路径
$filejudge = iconv('UTF-8','GB2312',preg_replace("/http:\/\/.*?\/(.*)/",'$1',$fileURI));
 
//判断 Http 请求来源,来自本站且有 file 值则继续。
if($fileURI && ((strpos($_SERVER['HTTP_REFERER'],$blogURL) || $_SERVER['HTTP_REFERER']=='') !== false)){
		if(file_exists($filejudge)){//判断文件是否存在,防止建立无用行。
			$tableRecord = $wpdb->query('Describe download_count ID');
			if($tableRecord == '0'){//没有表则新建 download_count表
				$wpdb->query('CREATE TABLE download_count(ID int AUTO_INCREMENT,filename varchar(255),count int,PRIMARY KEY (ID))default charset=utf8');
			};
			$lineRecord = $wpdb->query('SELECT ID FROM download_count where filename = "' . $filename . '"');
			if($lineRecord == ''){//表中无对应文件名则插入初始化行
				$wpdb->query('INSERT INTO download_count(filename, count) VALUES("' . $filename . '","1")');
			}else{//有则为 count 加一
				$rowCount = $wpdb->get_var('SELECT count FROM download_count where filename = "' . $filename . '"');
				$rowCount++;
				$wpdb->query('UPDATE download_count SET count = "' . $rowCount . '" where filename = "' . $filename . '"');
			};
		};
		header("Location: $fileURI");//重定向到真实文件地址,如果不存在则应返回404页面。
		exit;
}else{
	//来自站外或没有 file 值则跳转至首页
	header("Location: http://$blogURL/");
	exit;
};
?>
<!DOCTYPE HTML> 
<html dir="ltr" lang="zh-CN">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
</html>

如果我们想下载http://example.com/a.zip,那么写入下载地址的时候写为http://example.com/dl.php?file=http://example.com/a.zip即可。这样下载该文件时就可以在数据库内新建一个表 download_count:以文件名作为 filename 的值,链接每点击一次,则 count 加 1。本地 WAMP 调试正常。

自动生成对应链接的方法有两种思路,任选其一:

  • 如果不想每次都得自己加前面的网址的话也不想对以前的文章进行修改的话,可以使用这段 JavaScript:
    //选择器根据主题模板替换
    $('.entry-text a:not([href*="#more"])').each(function(){
    	if($(this).children('img').length<=0){
    	var href = $(this).attr('href');
    	var pattern1 = /\.((7z)|(zip)|(rar)|(r\d\d)|(pdf)|(docx?)|(xlsx?)|(mp\d)|(js)|(swf)|(flv))+$/g;//允许自动添加的文件后缀
    	var pattern2 = /(^https?:\/\/example\.com\/)|(^\/)/g;//替换为你的博客地址,只对站内文件操作。
    	if(pattern1.test(href) && pattern2.test(href)){
    		$(this).attr('href','http://example.com/dl.php?file=' + href);//替换为你的博客地址
    	};
    	};
    });
  • 用短代码功能生成下载链接,并接显示下载次数,是最好的方法,放到主题functions.php内:
    function download_count($attrs, $url=null){
    	global $wpdb;
    	extract(shortcode_atts(array("title"=>""),$attrs));
    	if($title==""){$title = $url;};
    	$filename = preg_replace("/.*\/(.*)/",'$1',$url);
    	$href = 'http://example.com/dl.php?file=' . $url;
    	$count = $wpdb->get_var('SELECT count FROM download_count where filename = "' . $filename . '"');
    	if(!$count){$count=0;};
    	return '<a href="' . $href . '">' . $title . '</a> (下载 ' . $count .  ' 次)';
    	}
    add_shortcode('download','download_count');

    每次调用时使用[download title="下载点我"]http://example.com/abc.zip[/download]即可(不写 title 则显示链接地址),生成下载地址的右边会显示当前下载的次数。

  1. 额,自己改代码难度大了点呀, :evil:

  2. 呵呵 可以自己写下载统计数目,不错。

  3. 高手有事相求 期待邮箱留联系 :oops:

  4. 做个记号备用。估计会用上的,不过我觉得用插件有个 pop 悬浮窗口模式那个感觉很好。

  5. 我对把附件单独放在一个二级域名上,按照你说的方法做了,就是最后点击下载链接的时候有问题:一点链接,打开一个页面,一行乱码,就停在这了,没法下载。不知道要修改什么地方,希望能帮帮我。O(∩_∩)O 谢谢

  6. 我已经习惯了用插件。

  7. 现在没特殊情况不想升级了, WP 太人性话了, 充满激情的 WP