一号优惠经验分享网
51福利网的各种薅羊毛福利经验笔记

wordpress利用高德地图获取用户ip地址地理位置

我们上文已经可以:利用高德地图获取用户ip地址地理位置php代码

如果我是WordPress某个主题网站的开发者,我会将这个识别用户IP地址的代码放在主题的functions.php文件中。

51福利网

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();

            // 以上是新增的代码
        }
    }
}

一号优惠 · 51福利网薅羊毛福利具有时效性,如已失效,请留言
文章名称:《wordpress利用高德地图获取用户ip地址地理位置》-一号优惠 · 51福利网
免责申明:本站所有活动信息均来自网络,如有失效、违规、不实或侵权,请联系我们删除。谢谢

评论 抢沙发

一号优惠经验分享网最新最全薅羊毛,现金红包线报网

一号优惠经验分享网提供每日最新内部优惠,薅羊毛活动,现金红包领取,免费福利和网赚福利手机赚钱线报,打造中国最受欢迎的网赚信息发布平台!51福利网

51联盟线报群赚钱·合作·帮助

登录

找回密码

注册