显示 WordPress 评论用户IP所在地及网络

林继 WordPress 5,252 共写了332个字 (2011-01-13 20:22:18) 3条评论 打印 扫描二维码 百度已收录

首先,在你的 WordPress 主题的 functions.php 中添加如下代码。

第二步,很重要,去下载一个 QQWry.Dat 文件放到你的主题根目录下,大概是 7.44 M,这是一个 IP 数据库。下载地址在这里。

  1. function convertip($ip) {
  2.     $dat_path = TEMPLATEPATH.'/QQWry.Dat';
  3.     if(!$fd = @fopen($dat_path, 'rb')){
  4.         return 'IP date file not exists or access denied';
  5.     }
  6.     $ip = explode('.', $ip);
  7.     $ipNum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3];
  8.     $DataBegin = fread($fd, 4);
  9.     $DataEnd = fread($fd, 4);
  10.     $ipbegin = implode('', unpack('L', $DataBegin));
  11.     if($ipbegin < 0) $ipbegin += pow(2, 32);
  12.     $ipend = implode('', unpack('L', $DataEnd));
  13.     if($ipend < 0) $ipend += pow(2, 32);
  14.     $ipAllNum = ($ipend - $ipbegin) / 7 + 1;
  15.     $BeginNum = 0;
  16.     $EndNum = $ipAllNum;
  17.     while($ip1num>$ipNum || $ip2num<$ipNum) {
  18.         $Middle= intval(($EndNum + $BeginNum) / 2);
  19.         fseek($fd, $ipbegin + 7 * $Middle);
  20.         $ipData1 = fread($fd, 4);
  21.         if(strlen($ipData1) < 4) {
  22.             fclose($fd);
  23.             return 'System Error';
  24.         }
  25.         $ip1num = implode('', unpack('L', $ipData1));
  26.         if($ip1num < 0) $ip1num += pow(2, 32);
  27.         if($ip1num > $ipNum) {
  28.             $EndNum = $Middle;
  29.             continue;
  30.         }
  31.         $DataSeek = fread($fd, 3);
  32.         if(strlen($DataSeek) < 3) {
  33.             fclose($fd);
  34.             return 'System Error';
  35.         }
  36.         $DataSeek = implode('', unpack('L', $DataSeek.chr(0)));
  37.         fseek($fd, $DataSeek);
  38.         $ipData2 = fread($fd, 4);
  39.         if(strlen($ipData2) < 4) {
  40.             fclose($fd);
  41.             return 'System Error';
  42.         }
  43.         $ip2num = implode('', unpack('L', $ipData2));
  44.         if($ip2num < 0) $ip2num += pow(2, 32);
  45.         if($ip2num < $ipNum) {
  46.             if($Middle == $BeginNum) {
  47.                 fclose($fd);
  48.                 return 'Unknown';
  49.             }
  50.             $BeginNum = $Middle;
  51.         }
  52.     }
  53.     $ipFlag = fread($fd, 1);
  54.     if($ipFlag == chr(1)) {
  55.         $ipSeek = fread($fd, 3);
  56.         if(strlen($ipSeek) < 3) {
  57.             fclose($fd);
  58.             return 'System Error';
  59.         }
  60.         $ipSeek = implode('', unpack('L', $ipSeek.chr(0)));
  61.         fseek($fd, $ipSeek);
  62.         $ipFlag = fread($fd, 1);
  63.     }
  64.     if($ipFlag == chr(2)) {
  65.         $AddrSeek = fread($fd, 3);
  66.         if(strlen($AddrSeek) < 3) {
  67.             fclose($fd);
  68.             return 'System Error';
  69.         }
  70.         $ipFlag = fread($fd, 1);
  71.         if($ipFlag == chr(2)) {
  72.             $AddrSeek2 = fread($fd, 3);
  73.             if(strlen($AddrSeek2) < 3) {
  74.                 fclose($fd);
  75.                 return 'System Error';
  76.             }
  77.             $AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
  78.             fseek($fd, $AddrSeek2);
  79.         } else {
  80.             fseek($fd, -1, SEEK_CUR);
  81.         }
  82.         while(($char = fread($fd, 1)) != chr(0))
  83.         $ipAddr2 .= $char;
  84.         $AddrSeek = implode('', unpack('L', $AddrSeek.chr(0)));
  85.         fseek($fd, $AddrSeek);
  86.         while(($char = fread($fd, 1)) != chr(0))
  87.         $ipAddr1 .= $char;
  88.     } else {
  89.         fseek($fd, -1, SEEK_CUR);
  90.         while(($char = fread($fd, 1)) != chr(0))
  91.         $ipAddr1 .= $char;
  92.  
  93.         $ipFlag = fread($fd, 1);
  94.         if($ipFlag == chr(2)) {
  95.             $AddrSeek2 = fread($fd, 3);
  96.             if(strlen($AddrSeek2) < 3) {
  97.                 fclose($fd);
  98.                 return 'System Error';
  99.             }
  100.             $AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
  101.             fseek($fd, $AddrSeek2);
  102.         } else {
  103.             fseek($fd, -1, SEEK_CUR);
  104.         }
  105.         while(($char = fread($fd, 1)) != chr(0)){
  106.             $ipAddr2 .= $char;
  107.         }
  108.     }
  109.     fclose($fd);
  110.     if(preg_match('/http/i', $ipAddr2)) {
  111.         $ipAddr2 = '';
  112.     }
  113.     $ipaddr = "$ipAddr1 $ipAddr2";
  114.     $ipaddr = preg_replace('/CZ88.Net/is', '', $ipaddr);
  115.     $ipaddr = preg_replace('/^s*/is', '', $ipaddr);
  116.     $ipaddr = preg_replace('/s*$/is', '', $ipaddr);
  117.     if(preg_match('/http/i', $ipaddr) || $ipaddr == '') {
  118.         $ipaddr = 'Unknown';
  119.     }
  120.     $ipaddr = iconv('gbk', 'utf-8//IGNORE', $ipaddr); 
  121.     if( $ipaddr != '  ' )
  122.         return $ipaddr;
  123.     else
  124.         $ipaddr = '地址未知!火星来客?';
  125.         return $ipaddr;
  126. }

第三步,找到你的 comments.php 或者 functions.php 中的评论相关的函数,我是放在评论时间函数的后面,你也可以放在喜欢的地方,插入如下代码:

  1. <?php if ( is_user_logged_in() ) echo convertip(get_comment_author_ip()); ?>

这里用了一个判断仅让管理员可见,大功告成,具体操作就看大家的了。
本文来自:http://wange.im/show-address-of-visitors-in-wordpress.html

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

3条评论
  • Fluky Loser oO

    2012年2月14日 18:56:13

    很不错,马上加上去!

  • KIndy

    2011年1月19日 13:42:42

    有没有效果图

    1. 林继

      2011年1月19日 16:17:59

      下面就是效果图,不知对不对?这只是一种娱乐,IP都可以是假的。
      [img]/wp-content/uploads/2011/01/kindy.png[/img]

发表评论

电子邮件地址不会被公开。 必填项已用*标注

< >