WordPress发布文章显示IP归属地

8个月前 φ合肥 24

之前呢,利用纯真IP库实现评论者IP归属地。最近突然想折腾一下,或许是在扬州行的想法吧,像朋友圈那样,可以显示发布信息的定位,以后或许能将这些定位串起来,形成一个轨迹,也许这也是人生的轨迹。本想直接找段代码直接来用的,没找到,或许大家没有这样的需求。后来还是找到了一款插件,叫apoyl-ip,有兴趣可以去看看。看了下代码,他是将IP地址记录到数据库里,然后读取数据库信息来显示IP归属地的。我感觉有点复杂了(看了下数据库才发现,评论的IP信息是有数据库字段的,文章作者却没有,希望官方可以考虑加一个)。

于是我想到了另外一种方法——自定义字段。没错,就是在发布文章时将作者的IP地址记录到自定义字段里,然后get字段,转换为归属地。好,思路有了,说干就干。

演示见本文标题下所显示的城市。

获取作者发布文章时的IP

//在发布文章时添加作者IP字段,开始
add_action('publish_post', 'get_the_author_ip');
function get_the_author_ip($post_id) {
    // 添加自定义字段
    $meta_key = 'hjylIP'; // 自定义字段名称
    $meta_value = $_SERVER['REMOTE_ADDR']; // 自定义字段值

    // 添加自定义字段到文章
    add_post_meta($post_id, $meta_key, $meta_value, true);
}
//在发布文章时添加作者IP字段,结束

这个简单吧,WP官网上抄来的,其中关键的是$_SERVER['REMOTE_ADDR'],正常都是这个,如果是用代理或者反向代理,可能需要根据实际情况修改,譬如$_SERVER['HTTP_CLIENT_IP']或者$_SERVER['HTTP_X_FORWARDED_FOR']。

将IP信息转换为归属地信息

这个就用现成的,利用之前的纯真IP库同样可以实现。纯真IP库有个好处就是每周都会更新数据库,而且社区版是免费的,只是准确率没有收费版的精确。这也是我为什么在自定义字段里记录IP,而不直接记录归属地信息。具体可以了解之前的文章(点此跳转),这里修改部分代码。

//文章作者发文归属地函数
function getAuthorIp($ip){
    if(empty($ip)) $ip = get_post_meta($post->ID,"hjylIP", true);
    $qqwry_filepath = get_template_directory() .'/qqwry.dat';
    $getLocation = json_encode(IpLocation::getLocation($ip, $qqwry_filepath), JSON_UNESCAPED_UNICODE) . "\n";
    $IPinfo = json_decode($getLocation, true);
    $country = $IPinfo['country'];
    $province = $IPinfo['province'];
    //优先显示城市,其次省,最后国家
    $city = $IPinfo['city'];
    if($ip == '127.0.0.1'){
        $data = '小黑屋';
    }elseif($city != ""){
        $data = $city;
    }elseif($province !== "" && $city == ""){
        $data = $province;
    }else{
        $data = $country;
    }
    
    return $data;
}

这里与评论不同的是精确到了城市,所以希望纯真IP越做越精确啊,这样我的人生轨迹也完整和精确。

调用IP归属地代码

在single.php你想放的位置调用归属地代码即可。

<?php 
	if(function_exists('getAuthorIp') && !empty(get_post_meta($post->ID,"hjylIP", true))) {
		echo 'φ';
		echo getAuthorIp(get_post_meta($post->ID,"hjylIP", true));
	}//支持文章作者IP归属地
?>

别看这么简单的代码,搞得我一身汗,可能大家需求没那么高,毕竟IP这个东西也算是隐私。当然希望对有需求的人有所帮助。可能有人会问,为什么以前的文章没有归属地信息呢?因为之前没有IP信息记录啊!

24 条评论

  1. #1

    这么晚还没睡呢,这个对于我没啥用,长年都是一个Ip,ip地址叫在闺女旁边侯着。😄😄😄😄

    • @Jeffer.Z 是啊,经常这样熬夜!大都没有这样的需求,但是你这个也太幸福了吧!

  2. #2

    定位这个免费的接口好像都有问题了,很多网站都有,一会我在昆明,一会我在红河,反正就是在云南省境内游荡,目前仅有大平台显示我是在丽江哈,个人博客90%以上错的

    • @sagrre 是的,我感觉免费的定位精确度只能到省,收费的精确度能达到城市以及下面的地区。

  3. #3

    这个,哈哈哈。
    我的 ip 地址几百年都不怎么变得,偶尔变变化也不大。
    不如直接加个标记叫做写于 山东青岛,更简单~~

  4. #4

    很类似,我用的是 IP2Location 数据库,也是后来才加的

    • @Dabenshi 是啊,一开始没找到好用的插件,就自己折腾了,后来发现wp还有几个这样的插件的。

  5. #5

    河南这边移动4G的IP有时候会乱显示,南阳郑州濮阳,随机。

  6. #6

    免费的纯真IP库虽然准确度差了一些,但是简单用一用还是可以的。

  7. #7

    以前的QQ显IP外挂好厉害的,对方在哪个网吧都能知道。

    • @墨铺网 是吧,当时用的就是纯真IP库外挂,准不准不知道,但是感觉就很牛逼。

  8. #8
    KK
    KK -@

    我试一下效果呢~~~看准不,

    话说,请教下,我要如何才能给访客留住 评论信息呢。。加了一段JS好像没起作用

  9. #9
    KK
    KK -@

    那是qq 泄露用户信息,

  10. #10

    又实现了一个功能,棒!