WordPress获取真实IP
之前写《WordPress后台登陆邮件提醒》的时候,用到了$_SERVER['REMOTE_ADDR']
来获取访客的IP地址,麦田一根葱提醒说这样获取的不是真实的地址,根据他的代码改了一下,让WordPress取得真实IP。当然,在很多情况下,$_SERVER['REMOTE_ADDR']
取得的就是真实地址了~~
代码:
/** * 获取用户真实IP * Modified Gimhoy (https://blog.gimhoy.com) */ function getIP() { static $realIP; if (isset($_SERVER)){ if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])){ $realIP = explode(',', $_SERVER["HTTP_X_FORWARDED_FOR"]); $realIP = $realIP[0]; } else if (isset($_SERVER["HTTP_CLIENT_IP"])) { $realIP = $_SERVER["HTTP_CLIENT_IP"]; } else { $realIP = $_SERVER["REMOTE_ADDR"]; } } else { if (getenv("HTTP_X_FORWARDED_FOR")){ $realIP = getenv("HTTP_X_FORWARDED_FOR"); } else if (getenv("HTTP_CLIENT_IP")) { $realIP = getenv("HTTP_CLIENT_IP"); } else { $realIP = getenv("REMOTE_ADDR"); } } $_SERVER['REMOTE_ADDR'] = $realIP; //return $realIP; } add_action( 'init', 'getIP' );
丢进当前主题的functions.php中即可~
IP转换为归属地
之前也有网友问如何将IP转换成归属地,这个有几种方法,简单介绍如下:
1.使用纯真IP数据库
纯真IP数据库也就是QQ IP数据库纯真版,收集了包括中国电信、中国网通、长城宽带、网通宽带、聚友宽带等 ISP 的最新准确 IP 地址数据。包括最全的网吧数据,IP数据库每5天更新一次。
使用方法:下载QQ IP数据库纯真版,百度一下就能找到了~将其中的QQWry.Dat放入主题目录下。然后在当前主题下的functions.php中丢入以下代码
//IP转地址 function convertip($ip) { $dat_path = TEMPLATEPATH.'/QQWry.Dat'; if(!$fd = @fopen($dat_path, 'rb')){ return 'IP date file not exists or access denied'; } $ip = explode('.', $ip); $ipNum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3]; $DataBegin = fread($fd, 4); $DataEnd = fread($fd, 4); $ipbegin = implode('', unpack('L', $DataBegin)); if($ipbegin < 0) $ipbegin += pow(2, 32); $ipend = implode('', unpack('L', $DataEnd)); if($ipend < 0) $ipend += pow(2, 32); $ipAllNum = ($ipend - $ipbegin) / 7 + 1; $BeginNum = 0; $EndNum = $ipAllNum; while($ip1num>$ipNum || $ip2num<$ipNum) { $Middle= intval(($EndNum + $BeginNum) / 2); fseek($fd, $ipbegin + 7 * $Middle); $ipData1 = fread($fd, 4); if(strlen($ipData1) < 4) { fclose($fd); return 'System Error'; } $ip1num = implode('', unpack('L', $ipData1)); if($ip1num < 0) $ip1num += pow(2, 32); if($ip1num > $ipNum) { $EndNum = $Middle; continue; } $DataSeek = fread($fd, 3); if(strlen($DataSeek) < 3) { fclose($fd); return 'System Error'; } $DataSeek = implode('', unpack('L', $DataSeek.chr(0))); fseek($fd, $DataSeek); $ipData2 = fread($fd, 4); if(strlen($ipData2) < 4) { fclose($fd); return 'System Error'; } $ip2num = implode('', unpack('L', $ipData2)); if($ip2num < 0) $ip2num += pow(2, 32); if($ip2num < $ipNum) { if($Middle == $BeginNum) { fclose($fd); return 'Unknown'; } $BeginNum = $Middle; } } $ipFlag = fread($fd, 1); if($ipFlag == chr(1)) { $ipSeek = fread($fd, 3); if(strlen($ipSeek) < 3) { fclose($fd); return 'System Error'; } $ipSeek = implode('', unpack('L', $ipSeek.chr(0))); fseek($fd, $ipSeek); $ipFlag = fread($fd, 1); } if($ipFlag == chr(2)) { $AddrSeek = fread($fd, 3); if(strlen($AddrSeek) < 3) { fclose($fd); return 'System Error'; } $ipFlag = fread($fd, 1); if($ipFlag == chr(2)) { $AddrSeek2 = fread($fd, 3); if(strlen($AddrSeek2) < 3) { fclose($fd); return 'System Error'; } $AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0))); fseek($fd, $AddrSeek2); } else { fseek($fd, -1, SEEK_CUR); } while(($char = fread($fd, 1)) != chr(0)) $ipAddr2 .= $char; $AddrSeek = implode('', unpack('L', $AddrSeek.chr(0))); fseek($fd, $AddrSeek); while(($char = fread($fd, 1)) != chr(0)) $ipAddr1 .= $char; } else { fseek($fd, -1, SEEK_CUR); while(($char = fread($fd, 1)) != chr(0)) $ipAddr1 .= $char; $ipFlag = fread($fd, 1); if($ipFlag == chr(2)) { $AddrSeek2 = fread($fd, 3); if(strlen($AddrSeek2) < 3) { fclose($fd); return 'System Error'; } $AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0))); fseek($fd, $AddrSeek2); } else { fseek($fd, -1, SEEK_CUR); } while(($char = fread($fd, 1)) != chr(0)){ $ipAddr2 .= $char; } } fclose($fd); if(preg_match('/http/i', $ipAddr2)) { $ipAddr2 = ''; } $ipaddr = "$ipAddr1 $ipAddr2"; $ipaddr = preg_replace('/CZ88.Net/is', '', $ipaddr); $ipaddr = preg_replace('/^s*/is', '', $ipaddr); $ipaddr = preg_replace('/s*$/is', '', $ipaddr); if(preg_match('/http/i', $ipaddr) || $ipaddr == '') { $ipaddr = 'Unknown'; } $ipaddr = iconv('gbk', 'utf-8//IGNORE', $ipaddr); if( $ipaddr != ' ' ) return $ipaddr; else $ipaddr = '地址未知!火星来客?'; return $ipaddr; }
使用的时候调用这个函数即可。
2.采用IP查询API接口
国内不少互联网公司例如腾讯、新浪以及淘宝都有IP查询接口,直接调用查询即可。
(1)腾讯IP分享计划
/* *根据腾讯IP分享计划的地址获取IP所在地,比较精确 */ function getIPLoc_QQ($ip1){ $url = 'https://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所在地 */ function getIPLoc_sina($ip1){ $url = 'https://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所在地 */ function getCity($ip) { $url="https://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; }
应用
这篇文章太长了。。下一篇文章讲应用=。= 应用见下面的文章:
🙄
反馈下你的主题,我用GOOGLE 看你的博客,一按返回你右边的侧边栏会跑到左边去,不过刷新下就好了
还有你的代码想用啊,但是复制很蛋疼有木有....
主题的问题我已经发现了,之后会抽空修改。代码没找着好用的插件,暂时只能这样了。。感谢支持~
请教下博主,我用了获取真实ip这个代码。但是在wordpress后台评论里面所看到的ip和我收到邮件中的ip不一样啊。
@1234:可能是你用了两个不同的方法获取的IP
@Gimhoy:谢谢博主,还真是的。主题自带了获取ip的代码,不过这个代码有些坑爹了,获取不到真实的ip。我得去反馈反馈,建议作者用用你的代码。
晕。一复制格式全乱了。。。
@root9000:不客气~复制怎么会乱格式呢?用了插件显示代码的。。
不错不错,用上了。谢谢博主
主题真不错
我也觉得不错
代码狂....居然丢进functions.php里,学习了
@麦田一根葱:方便以后继续用~我专门建了个php放我自己用的各种函数,换主题的时候require一下就OK了 😎
@Gimhoy:这个方法不错 放在我下个主题里
@Gimhoy:能不能告诉我你的评论表情怎么搞的呢?
http://blog.gimhoy.com/archives/wordpress-comment-smiley.html 里面讲的很详细