在WordPress中使用PHP腳本來(lái)判斷訪(fǎng)客來(lái)自什么國(guó)家
區(qū)分訪(fǎng)客國(guó)家有什么用?
這里是幾個(gè)我利用該功能的例子.
1.區(qū)分網(wǎng)站功能
這個(gè)博客有翻譯文章的功能, 這是為了方便海外訪(fǎng)客閱讀文章, 但對(duì)中國(guó)人顯得十分多余. 所以我通過(guò) IP 判斷國(guó)家, 對(duì)中國(guó)大陸地區(qū)屏蔽翻譯功能.
2.區(qū)分展示廣告
比如中國(guó)大陸地區(qū)在側(cè)邊欄最下方看到的是拿福能的廣告, 而其他地區(qū)看到的是 Google 的廣告. hostucan 是我的一個(gè)廣告主, 有英文網(wǎng)站, 也有中文網(wǎng)站, 所以我可以向他提供區(qū)分展示服務(wù), 免得浪費(fèi)流量.
3.屏蔽布點(diǎn)服務(wù)
海外有很多好的服務(wù)平臺(tái), 在網(wǎng)站上布點(diǎn)即可采集數(shù)據(jù)和分享文章. 但很不幸, 因?yàn)槟承┰? 他們?cè)趪?guó)內(nèi)展示效果并不好, 不但沒(méi)有起到應(yīng)有效果, 還讓頁(yè)面加載時(shí)間變長(zhǎng). 可以對(duì)大陸訪(fǎng)客屏蔽這些布點(diǎn).
在 PHP 通過(guò) IP 區(qū)分國(guó)家
如何用 PHP 通過(guò) IP 區(qū)分國(guó)家和地區(qū)呢? Maxmind.com 提供一套 GeoIP 的解決方案, 只需要簡(jiǎn)單幾步即可在 PHP 中通過(guò) IP 判斷訪(fǎng)客的國(guó)家.
1. 下載數(shù)據(jù)庫(kù)和 PHP 庫(kù)文件
下載 GeoID.dat.gz, 解壓為 GeoIP.dat 文件.
下載 geoip.inc.
2. 通過(guò) PHP 代碼獲取國(guó)家信息
以下是一段示范代碼, 演示如何獲取國(guó)家代號(hào)和國(guó)家名稱(chēng).
<?php
// 引入 PHP 庫(kù)文件
include("geoip.inc");
// 打開(kāi)本地?cái)?shù)據(jù)庫(kù), 數(shù)據(jù)保存在 GeoIP 文件中.
$geoData = geoip_open('GeoIP.dat', GEOIP_STANDARD);
// 獲取國(guó)家 IP
$countryCode = geoip_country_code_by_addr($geoData, $_SERVER['REMOTE_ADDR']);
// 獲取國(guó)家名稱(chēng)
$countryName = geoip_country_name_by_addr($geoData, $_SERVER['REMOTE_ADDR']);
// 關(guān)閉本地?cái)?shù)據(jù)庫(kù)
geoip_close($geoData);
?>
在 WordPress 中通過(guò) IP 區(qū)分國(guó)家
既然 PHP 上使用沒(méi)問(wèn)題, WordPress 肯定也是 Okay 的. 看看我是怎么使用的.
1. 放置數(shù)據(jù)庫(kù)文件
將 GeoIP.dat 解壓到 WordPress 根目錄中. (你可以在這個(gè)目錄找到 wp-config.php 或者 wp-config-sample.php 文件)
2. 編寫(xiě)調(diào)用接口
在主題目錄中新建文件夾 include, 將 geoip.inc 放置在新建文件夾中. 并在該文件夾新建文件 geoip.php 文件內(nèi)容如下.
<?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);
?>
這里只取國(guó)家代號(hào)作為判別依據(jù). 并且國(guó)家代號(hào)是全局變量, 以避免頁(yè)面多處判斷需要反復(fù)訪(fǎng)問(wèn) GeoIP.dat 獲取信息, 減少程序開(kāi)銷(xiāo).
2. 調(diào)用接口, 獲取國(guó)家代號(hào)
3. 打開(kāi) header.php 文件, 在文件頂部加入代碼如下.
<?php include('include/geoip.php'); ?>
4. 使用國(guó)家代號(hào)
在主題中調(diào)用代碼, 例子如下.
<?php
global $countryCode;
if($countryCode == 'CN') {
// 中國(guó)大陸地區(qū)執(zhí)行的代碼
} else if($countryCode == 'US') {
// 美國(guó)地區(qū)執(zhí)行的代碼
} else {
// 中國(guó)大陸和美國(guó)以外地區(qū)執(zhí)行的代碼
}
?>
可能有人會(huì)問(wèn), 加這么個(gè)東西, 性能如何? 會(huì)不會(huì)要求強(qiáng)大的服務(wù)器? 我測(cè)試過(guò), 正常的服務(wù)器上幾乎不影響頁(yè)面加載性能, 可以看看這個(gè)博客的速度. 如果不放心, 自己測(cè)一下.
PS:采用IP查詢(xún)API接口
國(guó)內(nèi)不少互聯(lián)網(wǎng)公司例如騰訊、新浪以及淘寶都有IP查詢(xún)接口,直接調(diào)用查詢(xún)即可。
(1)騰訊IP分享計(jì)劃
/**根據(jù)騰訊IP分享計(jì)劃的地址獲取IP所在地,比較精確*/function getIPLoc_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) ; // 獲取數(shù)據(jù)返回$result = curl_exec($ch);$result = mb_convert_encoding($result, "utf-8", "gb2312"); // 編碼轉(zhuǎn)換,否則亂碼curl_close($ch);preg_match("@<span>(.*)</span></p>@iU",$result,$ipArray);$loc = $ipArray[1];return $loc;}
(2)新浪IP查詢(xún)接口
/**根據(jù)新浪IP查詢(xún)接口獲取IP所在地*/function getIPLoc_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) ; // 獲取數(shù)據(jù)返回$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接口
/** * 根據(jù)淘寶IP查詢(xún)接口獲取IP所在地 */function getCity($ip){$url="http://ip.taobao.com/service/getIpInfo.php?ip=".$ip;$ip=json_decode(file_get_contents($url));if((string)$ip->code=='1'){ return false; } $data = (array)$ip->data;return $data;}
總結(jié)
通過(guò) IP 判斷訪(fǎng)客來(lái)源十分精準(zhǔn)的, 現(xiàn)在一些外貿(mào)網(wǎng)站都是通過(guò)這個(gè)方法向用戶(hù)進(jìn)行展示區(qū)分, 比如美國(guó)地區(qū)的用戶(hù)默認(rèn)看到美國(guó)能買(mǎi)到的商品和美國(guó)物流信息. 但不是百分之百的準(zhǔn)確, 比如某人常年翻墻, 那他可能一直看不到本國(guó)的信息. 至于是否需要區(qū)分處理, 網(wǎng)站主要有所考慮.
- PHP判斷是手機(jī)端還是PC端 PHP判斷是否是微信瀏覽器
- thinkphp判斷訪(fǎng)客為手機(jī)端或PC端的方法
- php 判斷訪(fǎng)客是否為搜索引擎蜘蛛的函數(shù)代碼
- PHP中通過(guò)HTTP_USER_AGENT判斷是否為手機(jī)移動(dòng)終端的函數(shù)代碼
- 利用PHP判斷是手機(jī)移動(dòng)端還是PC端訪(fǎng)問(wèn)的函數(shù)示例
- php函數(shù)實(shí)現(xiàn)判斷是否移動(dòng)端訪(fǎng)問(wèn)
- php/asp/asp.net中判斷百度移動(dòng)和PC蜘蛛的實(shí)現(xiàn)代碼
- PHP判斷是否是微信打開(kāi)還是瀏覽器打開(kāi)的方法
- 通過(guò)JS和PHP兩種方法判斷用戶(hù)請(qǐng)求時(shí)使用的瀏覽器類(lèi)型
- 使用PHP和JavaScript判斷請(qǐng)求是否來(lái)自微信內(nèi)瀏覽器
- PHP判斷訪(fǎng)客是否手機(jī)端(移動(dòng)端瀏覽器)訪(fǎng)問(wèn)的方法總結(jié)【4種方法】
相關(guān)文章
PHP調(diào)用JAVA的WebService簡(jiǎn)單實(shí)例
本篇文章主要是對(duì)PHP調(diào)用JAVA的WebService簡(jiǎn)單實(shí)例進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2014-03-03
PHP Beanstalkd消息隊(duì)列的安裝與使用方法實(shí)例詳解
這篇文章主要介紹了PHP Beanstalkd消息隊(duì)列的安裝與使用方法,結(jié)合實(shí)例形式詳細(xì)分析了PHP Beanstalkd消息隊(duì)列的基本功能、原理、安裝、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2020-02-02
PHP封裝的簡(jiǎn)單連接MongoDB類(lèi)示例
這篇文章主要介紹了PHP封裝的簡(jiǎn)單連接MongoDB類(lèi),涉及php針對(duì)MongoDB數(shù)據(jù)庫(kù)的簡(jiǎn)單連接、數(shù)據(jù)插入、查詢(xún)等相關(guān)操作技巧,需要的朋友可以參考下2019-02-02
php中轉(zhuǎn)義mysql語(yǔ)句的實(shí)現(xiàn)代碼
如果你需要向數(shù)據(jù)庫(kù),插入形如’你好’,這樣包含有單引號(hào)或者雙引號(hào)的字符串怎么辦,當(dāng)然可以使用反斜杠進(jìn)行轉(zhuǎn)義,但是如果內(nèi)容太多呢?2011-06-06
PHP MYSQL亂碼問(wèn)題,使用SET NAMES utf8校正
PHP操作數(shù)據(jù)庫(kù)的時(shí)候,數(shù)據(jù)庫(kù)中數(shù)據(jù)使用UTF8編碼,在讀出來(lái)的時(shí)候,顯示的全是???????問(wèn)號(hào)亂碼,找了一些資料原來(lái)是在讀取之前進(jìn)行一次編碼設(shè)置2009-11-11
PHP 如何獲取二維數(shù)組中某個(gè)key的集合
PHP 獲取二維數(shù)組中某個(gè)key的集合2014-06-06

