我们上文已经可以:利用高德地图获取用户ip地址地理位置php代码
如果我是WordPress某个主题网站的开发者,我会将这个识别用户IP地址的代码放在主题的functions.php文件中。
functions.php是WordPress主题开发中的一个重要文件,它会在主题启动时自动加载,并包含了许多与主题有关的定义、函数和钩子。可以将一些与主题相关的代码放在这个文件中,以实现一些特定的功能。
因此,将这个识别用户IP地址的代码放在functions.php中是一个比较好的选择,这样可以确保代码在所有页面都得到执行,并且可以在需要的时候触发。当然,这也取决于具体的业务需求和网站架构,如果这个功能只需要在某个特定页面上使用,就应该将代码放在这个页面所属的文件中。
可以将以下代码放置到WordPress主题的functions.php文件中,这样代码就可以在整个站点中使用了:
代码如下
需要注意的是,这个代码使用了session_start()
函数来创建会话,因此使用之前需要确保该函数已经被调用。另外,其中的API KEY和跳转页面URL需要替换为自己的信息。
function get_user_info_by_ip() {
session_start();
$ip = '';
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$ip = trim($ips[count($ips) - 1]);
} elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (isset($_SERVER['REMOTE_ADDR'])) {
$ip = $_SERVER['REMOTE_ADDR'];
}
// 判断是否已经调用过高德地图
if (isset($_SESSION['amap']) && $_SESSION['amap']['ip'] == $ip) {
$province = $_SESSION['amap']['province'];
$city = $_SESSION['amap']['city'];
$userdizhi = $province . ' ' . $city;
return "您的位置是: " . $userdizhi;
} else {
$amap_key = 'your amap key';
$response = file_get_contents("https://restapi.amap.com/v3/ip?ip={$ip}&output=json&key={$amap_key}");
$data = json_decode($response, true);
if($data['status'] == 1 && $data['province'] != ""){
$province = $data['province'];
$city = $data['city'];
$_SESSION['amap'] = array(
'ip' => $ip,
'province' => $province,
'city' => $city
);
$userdizhi = $province . ' ' . $city;
return "您的位置是: " . $userdizhi;
} else {
header('Location: https://www.51yhyh.com'); // 跳转到指定页面
exit();
}
}
}
// 调用函数获取用户位置信息
echo get_user_info_by_ip();
将echo get_user_info_by_ip();放到你需要调用的地方即可
遇到一个问题就是如果是香港等海外地址,返回时array的提示。将ip直接查看返回时空数据
如果高德地图API返回的”province”字段值是空数组 “[]”,则说明该IP地址无法获取到对应的省份信息。在这种情况下,你可以在代码中添加一个判断,例如:
if($data['status'] == 1 && !empty($data['province']) && $data['province'] != "Array"){
// 位置信息可用,可继续进行操作
$province = $data['province'];
$city = $data['city'];
// ...
} else {
// 位置信息不可用,进行处理
$province = '未知';
$city = '未知';
// ...
}
以上代码添加了一个判断,当返回的”province”字段值不为空数组时,才认为位置信息是可用的,否则将省份和城市信息都设置为”未知”。你可以根据实际需求进行修改。
将以上所有代码整理如下;
function get_user_info_by_ip() {
session_start();
$ip = '';
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$ip = trim($ips[count($ips) - 1]);
} elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (isset($_SERVER['REMOTE_ADDR'])) {
$ip = $_SERVER['REMOTE_ADDR'];
}
// 判断是否已经调用过高德地图
if (isset($_SESSION['amap']) && $_SESSION['amap']['ip'] == $ip) {
$province = $_SESSION['amap']['province'];
$city = $_SESSION['amap']['city'];
$userdizhi = $province . ' ' . $city;
return " " . $userdizhi;
} else {
$amap_key = 'your key';
$response = file_get_contents("https://restapi.amap.com/v3/ip?ip={$ip}&output=json&key={$amap_key}");
$data = json_decode($response, true);
if($data['status'] == 1 && !empty($data['province']) && $data['province'] != "Array"){
// 位置信息可用,处理获取到的结果
$province = $data['province'];
$city = $data['city'];
$_SESSION['amap'] = array(
'ip' => $ip,
'province' => $province,
'city' => $city
);
$userdizhi = $province . ' ' . $city;
return "" . $userdizhi;
} else {
// 位置信息不可用,进行处理
$_SESSION['amap'] = array('ip' => $ip, 'province' => '未知', 'city' => '未知');
header('Location: https://www.51yhyh.com'); // 跳转到指定页面
exit();
}
}
}
在这个函数中,如果高德地图API返回的province字段值是空数组 “[]”,则会将province和city都设置为”未知”,并跳转到指定页面页面(请将链接替换为你实际需要跳转的页面)提醒用户无法获取位置信息。
为啥重新进入页面就不跳转了?
如果已经成功跳转到指定页面,然后重新刷新了页面,就不会再次跳转了,因为之前已经在session中缓存了位置信息,每次刷新页面时会从缓存中读取位置信息的值,而不会再次调用高德地图API进行获取。
如果你希望每次打开页面都重新获取位置信息并跳转到指定页面,可以将session中缓存位置信息的代码全部删除,也就是将以下一行代码删除:
$_SESSION['amap'] = array(
'ip' => $ip,
'province' => $province,
'city' => $city
);
这样每次打开页面时,都会调用高德地图API进行获取位置信息,如果无法获取到位置信息,则会跳转到指定页面。
如何能不再调用高德地图API进行获取位置信息,用缓存的未知让页面跳转
如果你需要在用户每次进入页面时都进行位置信息的获取,并且无法从缓存中读取位置信息,可以每次都进行跳转。
以下是示例代码:
function get_user_info_by_ip() {
session_start();
$ip = '';
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$ip = trim($ips[count($ips) - 1]);
} elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (isset($_SERVER['REMOTE_ADDR'])) {
$ip = $_SERVER['REMOTE_ADDR'];
}
// 判断是否已经调用过高德地图
if (isset($_SESSION['amap']) && $_SESSION['amap']['ip'] == $ip) {
$province = $_SESSION['amap']['province'];
$city = $_SESSION['amap']['city'];
$userdizhi = $province . ' ' . $city;
return " " . $userdizhi;
} else {
$unknown_addresses_file = 'unknown_addresses.txt';
if (file_exists($unknown_addresses_file)) {
$unknown_addresses = file_get_contents($unknown_addresses_file);
$unknown_addresses = unserialize($unknown_addresses);
} else {
$unknown_addresses = array();
}
if (isset($unknown_addresses[$ip])) {
$_SESSION['amap'] = array('ip' => $ip, 'province' => '未知', 'city' => '未知');
header('Location: https://www.51yhyh.com/xxfl/goout/chuguo'); // 跳转到指定页面
exit();
}
$amap_key = 'you key';
$response = file_get_contents("https://restapi.amap.com/v3/ip?ip={$ip}&output=json&key={$amap_key}");
$data = json_decode($response, true);
if($data['status'] == 1 && !empty($data['province']) ){
// 位置信息可用,处理获取到的结果
$province = $data['province'];
$city = $data['city'];
$_SESSION['amap'] = array(
'ip' => $ip,
'province' => $province,
'city' => $city
);
$userdizhi = $province . ' ' . $city;
return "" . $userdizhi;
} else {
// 位置信息不可用,进行处理
$_SESSION['amap'] = array('ip' => $ip, 'province' => '未知', 'city' => '未知');
$unknown_addresses[$ip] = true;
file_put_contents($unknown_addresses_file, serialize($unknown_addresses));
header('Location: https://www.51yhyh.com/xxfl/goout/chuguo'); // 跳转到指定页面
exit();
}
}
}
可是地址为未知,并没有跳转
,这段代码中有一个条件判断,只有当获取到了位置信息,并且省市信息不为空时,才会返回省和市的信息。如果无法获取到位置信息,或者获取到的位置信息中省市信息为空,那么会将状态设置为“未知”,然后将该IP地址保存在一个文件中,然后将网页重定向到特定页面。因此,如果地址为未知并且没有跳转,那么可能是因为获取位置信息失败,但是代码中没有进行重定向的处理。
你可以将以下代码:
} else {
// 位置信息不可用,进行处理
$_SESSION['amap'] = array('ip' => $ip, 'province' => '未知', 'city' => '未知');
$unknown_addresses[$ip] = true;
file_put_contents($unknown_addresses_file, serialize($unknown_addresses));
header('Location: https://www.51yhyh.com/xxfl/goout/chuguo'); // 跳转到指定页面
exit();
}
替换为以下代码:
} else {
// 位置信息不可用,进行处理
$_SESSION['amap'] = array('ip' => $ip, 'province' => '未知', 'city' => '未知');
$unknown_addresses[$ip] = true;
file_put_contents($unknown_addresses_file, serialize($unknown_addresses));
$redirect_url = 'https://www.51yhyh.com/xxfl/goout/chuguo'; // 设置重定向地址
if (isset($_SERVER['HTTP_REFERER'])) {
$redirect_url .= '?ref=' . urlencode($_SERVER['HTTP_REFERER']); // 传递来源页面的URL参数
}
header('Location: ' . $redirect_url);
exit();
}
修改后的代码会将获取位置信息失败的情况和之前一样,将状态设置为“未知”,并且将该IP地址保存在一个文件中。不同之处在于,现在将会跳转到一个特定的页面,并且可以将来源页面的URL参数传递给该页面。
如果你的实际情况是无法跳转,可能是因为在输入header函数之前,服务器已经向浏览器输出了一些内容。这时就需要先关闭输出缓冲,再进行跳转操作。你可以在代码中添加以下代码进行尝试:
ob_start(); // 开启输出缓冲
$unknown_addresses[$ip] = true;
file_put_contents($unknown_addresses_file, serialize($unknown_addresses));
$redirect_url = 'https://www.51yhyh.com/xxfl/goout/chuguo'; // 设置重定向地址
if (isset($_SERVER['HTTP_REFERER'])) {
$redirect_url .= '?ref=' . urlencode($_SERVER['HTTP_REFERER']); // 传递来源页面的URL参数
}
ob_clean(); // 清空输出缓冲
header('Location: ' . $redirect_url); // 执行重定向
exit();
最终代码如下
function get_user_info_by_ip() {
session_start();
$ip = '';
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$ip = trim($ips[count($ips) - 1]);
} elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (isset($_SERVER['REMOTE_ADDR'])) {
$ip = $_SERVER['REMOTE_ADDR'];
}
// 判断是否已经调用过高德地图
if (isset($_SESSION['amap']) && $_SESSION['amap']['ip'] == $ip) {
$province = $_SESSION['amap']['province'];
$city = $_SESSION['amap']['city'];
$userdizhi = $province . ' ' . $city;
return " " . $userdizhi;
} else {
$unknown_addresses_file = 'unknown_addresses.txt';
if (file_exists($unknown_addresses_file)) {
$unknown_addresses = file_get_contents($unknown_addresses_file);
$unknown_addresses = unserialize($unknown_addresses);
} else {
$unknown_addresses = array();
}
if (isset($unknown_addresses[$ip])) {
$_SESSION['amap'] = array('ip' => $ip, 'province' => '未知', 'city' => '未知');
// 以下是新增的代码,用于重定向到指定页面
ob_start(); // 开启输出缓冲
$redirect_url = 'https://www.51yhyh.com/xxfl/goout/chuguo'; // 设置重定向地址
if (isset($_SERVER['HTTP_REFERER'])) {
$redirect_url .= '?ref=' . urlencode($_SERVER['HTTP_REFERER']); // 传递来源页面的URL参数
}
ob_clean(); // 清空输出缓冲
header('Location: ' . $redirect_url); // 执行重定向
exit();
// 以上是新增的代码
}
$amap_key = 'your key';
$response = file_get_contents("https://restapi.amap.com/v3/ip?ip={$ip}&output=json&key={$amap_key}");
$data = json_decode($response, true);
if($data['status'] == 1 && !empty($data['province']) ){
// 位置信息可用,处理获取到的结果
$province = $data['province'];
$city = $data['city'];
$_SESSION['amap'] = array(
'ip' => $ip,
'province' => $province,
'city' => $city
);
$userdizhi = $province . ' ' . $city;
return "" . $userdizhi;
} else {
// 位置信息不可用,进行处理
$_SESSION['amap'] = array('ip' => $ip, 'province' => '未知', 'city' => '未知');
$unknown_addresses[$ip] = true;
file_put_contents($unknown_addresses_file, serialize($unknown_addresses));
// 以下是新增的代码,用于重定向到指定页面
ob_start(); // 开启输出缓冲
$redirect_url = 'https://www.51yhyh.com/xxfl/goout/chuguo'; // 设置重定向地址
if (isset($_SERVER['HTTP_REFERER'])) {
$redirect_url .= '?ref=' . urlencode($_SERVER['HTTP_REFERER']); // 传递来源页面的URL参数
}
ob_clean(); // 清空输出缓冲
header('Location: ' . $redirect_url); // 执行重定向
exit();
// 以上是新增的代码
}
}
}