在WordPress中使用PHP脚本来判断访客来自什么国家
区分访客国家有什么用?
这里是几个我利用该功能的例子.
1.区分网站功能
这个博客有翻译文章的功能,这是为了方便海外访客阅读文章,但对中国人显得十分多余.所以我通过IP判断国家,对中国大陆地区屏蔽翻译功能.
2.区分展示广告
比如中国大陆地区在侧边栏最下方看到的是拿福能的广告,而其他地区看到的是Google的广告.hostucan是我的一个广告主,有英文网站,也有中文网站,所以我可以向他提供区分展示服务,免得浪费流量.
3.屏蔽布点服务
海外有很多好的服务平台,在网站上布点即可采集数据和分享文章.但很不幸,因为某些原因,他们在国内展示效果并不好,不但没有起到应有效果,还让页面加载时间变长.可以对大陆访客屏蔽这些布点.
在PHP通过IP区分国家
如何用PHP通过IP区分国家和地区呢?Maxmind.com提供一套GeoIP的解决方案,只需要简单几步即可在PHP中通过IP判断访客的国家.
1.下载数据库和PHP库文件
下载GeoID.dat.gz,解压为GeoIP.dat文件.
下载geoip.inc.
2.通过PHP代码获取国家信息
以下是一段示范代码,演示如何获取国家代号和国家名称.
<?php
//引入PHP库文件
include("geoip.inc");
//打开本地数据库,数据保存在GeoIP文件中.
$geoData=geoip_open('GeoIP.dat',GEOIP_STANDARD);
//获取国家IP
$countryCode=geoip_country_code_by_addr($geoData,$_SERVER['REMOTE_ADDR']);
//获取国家名称
$countryName=geoip_country_name_by_addr($geoData,$_SERVER['REMOTE_ADDR']);
//关闭本地数据库
geoip_close($geoData);
?>
在WordPress中通过IP区分国家
既然PHP上使用没问题,WordPress肯定也是Okay的.看看我是怎么使用的.
1.放置数据库文件
将GeoIP.dat解压到WordPress根目录中.(你可以在这个目录找到wp-config.php或者wp-config-sample.php文件)
2.编写调用接口
在主题目录中新建文件夹include,将geoip.inc放置在新建文件夹中.并在该文件夹新建文件geoip.php文件内容如下.
<?php
include('geoip.inc');
global$countryCode;
$geoData=geoip_open('GeoIP.dat',GEOIP_STANDARD);
$countryCode=geoip_country_code_by_addr($geoData,$_SERVER['REMOTE_ADDR']);
geoip_close($geoData);
?>
这里只取国家代号作为判别依据.并且国家代号是全局变量,以避免页面多处判断需要反复访问GeoIP.dat获取信息,减少程序开销.
2.调用接口,获取国家代号
3.打开header.php文件,在文件顶部加入代码如下.
<?phpinclude('include/geoip.php');?>
4.使用国家代号
在主题中调用代码,例子如下.
<?php
global$countryCode;
if($countryCode=='CN'){
//中国大陆地区执行的代码
}elseif($countryCode=='US'){
//美国地区执行的代码
}else{
//中国大陆和美国以外地区执行的代码
}
?>
可能有人会问,加这么个东西,性能如何?会不会要求强大的服务器?我测试过,正常的服务器上几乎不影响页面加载性能,可以看看这个博客的速度.如果不放心,自己测一下.
PS:采用IP查询API接口
国内不少互联网公司例如腾讯、新浪以及淘宝都有IP查询接口,直接调用查询即可。
(1)腾讯IP分享计划
/**根据腾讯IP分享计划的地址获取IP所在地,比较精确*/functiongetIPLoc_QQ($ip1){$url='http://ip.qq.com/cgi-bin/searchip?searchip1='.$ip1;$ch=curl_init($url);curl_setopt($ch,CURLOPT_ENCODING,'gb2312');curl_setopt($ch,CURLOPT_TIMEOUT,10);curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);//获取数据返回$result=curl_exec($ch);$result=mb_convert_encoding($result,"utf-8","gb2312");//编码转换,否则乱码curl_close($ch);preg_match("@<span>(.*)</span></p>@iU",$result,$ipArray);$loc=$ipArray[1];return$loc;}
(2)新浪IP查询接口
/**根据新浪IP查询接口获取IP所在地*/functiongetIPLoc_sina($ip1){$url='http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip='.$ip1;$ch=curl_init($url);//curl_setopt($ch,CURLOPT_ENCODING,'utf8');curl_setopt($ch,CURLOPT_TIMEOUT,10);curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);//获取数据返回$location=curl_exec($ch);$location=json_decode($location);curl_close($ch);$loc="";if($location===FALSE)return"";if(emptyempty($location->desc)){$loc=$location->province.$location->city.$location->district.$location->isp;}else{$loc=$location->desc;}return$loc;}
(3)使用淘宝IP接口
/***根据淘宝IP查询接口获取IP所在地*/functiongetCity($ip){$url="http://ip.taobao.com/service/getIpInfo.php?ip=".$ip;$ip=json_decode(file_get_contents($url));if((string)$ip->code=='1'){returnfalse;}$data=(array)$ip->data;return$data;}
总结
通过IP判断访客来源十分精准的,现在一些外贸网站都是通过这个方法向用户进行展示区分,比如美国地区的用户默认看到美国能买到的商品和美国物流信息.但不是百分之百的准确,比如某人常年翻墙,那他可能一直看不到本国的信息.至于是否需要区分处理,网站主要有所考虑.