You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

WordPress简易地理定位求助:替换PHP unserialize改用JSON

用JSON实现WordPress基础地理定位(替代ip-api旧unserialize方法)

嘿,我懂你的处境!之前靠unserialize处理ip-api的地理数据确实容易踩坑,而且这个方法现在也过时了。既然ip-api推荐用JSON,咱就自己写几行轻量代码搞定,完全不用那些臃肿的插件,新手也能快速上手~

第一步:编写核心的地理定位函数

我们用WordPress自带的wp_remote_get来请求ip-api的JSON接口(比直接用file_get_contents更安全,还兼容WordPress的HTTP设置),同时加上缓存避免触发ip-api的请求限制。把下面的代码放到你主题的functions.php文件里:

function get_user_geo_data() {
    // 先检查缓存,减少重复请求(ip-api免费版有请求次数限制)
    $geo_data = get_transient('user_geo_data');
    
    if (false === $geo_data) {
        // 调用ip-api的JSON接口,指定需要的字段(按需调整)
        $api_url = 'https://ip-api.com/json/?fields=status,country,countryCode,region,regionName,city,zip,lat,lon,timezone';
        
        // 发送HTTP请求
        $response = wp_remote_get($api_url);
        
        // 检查请求是否成功
        if (!is_wp_error($response) && wp_remote_retrieve_response_code($response) === 200) {
            // 将JSON字符串解析为PHP关联数组
            $geo_data = json_decode(wp_remote_retrieve_body($response), true);
            
            // 缓存数据1小时(3600秒),可根据需求调整时长
            set_transient('user_geo_data', $geo_data, 3600);
        } else {
            // 请求失败时返回默认值
            $geo_data = [
                'status' => 'fail',
                'country' => 'Unknown'
            ];
        }
    }
    
    return $geo_data;
}

代码说明:

  • get_transientset_transient做缓存:避免频繁请求ip-api(免费版每天最多45000次,每分钟150次),同时提升网站加载速度。
  • json_decode(..., true):把JSON返回值转成关联数组,方便后续调用。
  • fields参数:只获取你需要的地理字段,减少返回的数据量,让请求更高效。你可以根据需求添加/删除字段(比如isporg等)。

第二步:在WordPress中调用地理数据

现在你可以在主题模板或者文章里调用这个函数,获取用户的地理位置信息。

方法1:在主题模板中直接调用

比如在header.php或者single.php里添加这段代码,显示用户所在地区:

$user_geo = get_user_geo_data();

if ($user_geo['status'] === 'success') {
    echo "<div class='user-location'>你当前所在:{$user_geo['country']} · {$user_geo['regionName']} · {$user_geo['city']}</div>";
} else {
    echo "<div class='user-location'>暂时无法获取你的地理位置</div>";
}

方法2:用短代码在编辑器中调用

如果你想在文章/页面编辑器里快速插入地理位置信息,可以添加一个短代码:

// 注册短代码
function geo_location_shortcode() {
    $user_geo = get_user_geo_data();
    
    if ($user_geo['status'] === 'success') {
        return "<p class='geo-info'>当前地区:{$user_geo['country']}({$user_geo['countryCode']}) - {$user_geo['city']}</p>";
    } else {
        return "<p class='geo-info'>无法获取地理位置信息</p>";
    }
}
add_shortcode('user_geo', 'geo_location_shortcode');

添加后,你在编辑器里输入[user_geo],就能自动显示用户的地理位置了。

第三步:一些重要的注意事项

  • HTTPS支持:如果你的网站用HTTPS,记得把api_url改成https://ip-api.com/json/,避免混合内容警告。
  • 请求限制:如果你的网站流量很大,免费版的请求次数可能不够,可以考虑ip-api的付费版,或者延长缓存时间。
  • 服务器权限:确保你的主机允许对外发送HTTP请求(大部分主流主机都支持,如果有问题可以联系主机商)。

这样就搞定啦,代码轻量简洁,完全不用那些冗余的插件,而且逻辑清晰,新手也能轻松修改调整~

内容的提问来源于stack exchange,提问作者IXN

火山引擎 最新活动