You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在WordPress中存储并展示上次登录的地区与浏览器信息?

问题描述

我遇到了一个无法自行解决的问题,希望能获得帮助,感谢任何解答与支持。

我目前已实现两个功能:一个用于设置上次登录与当前登录的日期,另一个用于获取前者设置的登录日期。通过简单的短代码,我可以展示上次登录和当前登录的日期,这部分功能运行正常。但除日期外,我还希望展示登录时所在的地区(国家/城市)以及使用的浏览器。

已实现功能

地理位置功能

我编写了一个地理位置函数,可返回经纬度值,通过反向地理编码获取可读地址,这部分功能运行正常。

浏览器获取功能

我还编写了一个通过用户代理(user agent)获取用户所用浏览器的小型函数,该功能同样运行良好。

核心问题

地理位置与浏览器获取函数的问题在于,它们始终返回当前值,这并非我想要的效果。我需要像存储登录日期一样,在用户登录时存储对应的地理位置和浏览器信息,之后再进行展示。例如,用户在00:00于A地点登录,该信息应被固定保存,而非显示当前所在位置。

那么,如何像存储登录日期一样,记录并保存登录时的地理位置与浏览器信息?说明:我的网站基于WordPress搭建。


日期函数代码

// 获取登录时间的函数
function get_last_login($user_id, $prev = null) {
  $last_login = get_user_meta($user_id);
  $time = current_time( 'timestamp' );
  if(isset($last_login['_last_login_prev'][0]) && $prev) {
  $last_login = get_user_meta($user_id, '_last_login_prev', 'true' );
  } 
  else if(isset($last_login['_last_login'][0])) {
    $last_login = get_user_meta($user_id, '_last_login', 'true' );
  } 
  else {
    update_user_meta( $user_id, '_last_login', $time );
    $last_login = $last_login['_last_login'][0];
  } return $last_login;
}

// 短代码1 - 显示上次登录日期
function last_login_date() {
  global $current_user;
  echo '<div class="lastlogin"> '.date("j/m/Y - H:i", get_last_login($current_user->ID, true)).' </div>';
}   add_shortcode('lastlogin', 'last_login_date');

// 短代码2 - 显示当前登录日期
function current_login_date() {
  global $current_user;
   echo '<p>当前登录日期: '. date("j M Y - H:i", get_last_login($current_user->ID)). '</p>';
}   add_shortcode('currentlogin', 'current_login_date');

地理位置函数代码

// 加载前端脚本
wp_enqueue_script( 'my-script', trailingslashit( get_stylesheet_directory_uri() ) . 'woocommerce/myaccount/assets/my-script.js', array( 'jquery-min' ), wp_get_theme()->version, true );

// 向前端脚本传递AJAX地址和验证密钥
wp_localize_script( 'my-script', 'localize', array(
  '_ajax_url' => admin_url( 'admin-ajax.php' ),
  '_ajax_nonce' => wp_create_nonce( '_ajax_nonce' ),
));

// AJAX处理函数:保存地理位置信息
add_action( 'wp_ajax__wpso_73934145', function () {

  if ( check_ajax_referer( '_ajax_nonce' ) ) {

    $user_id = get_current_user_id();
    $latitude = $_POST['latitude'];
    $longitude = $_POST['longitude'];
    $openStreetMapObject = $_POST['openStreetMapObject'];
    $meta_key = '_user_position';
    $meta_value = array(
        'latitude' => $latitude,
        'longitude' => $longitude,
        'openStreetMapObject' => $openStreetMapObject,
    );

    update_user_meta( $user_id, $meta_key, $meta_value );
    wp_send_json_success( $meta_value );

  } else {

    wp_send_json_error();

  };

  wp_die();

});

地理位置功能前端脚本(my-script.js)

console.log( 'my-script.js 已成功加载' );

if ( navigator.geolocation ) {
    window.navigator.geolocation.getCurrentPosition( function( position ) {

        let lat = position.coords.latitude;
        let lon = position.coords.longitude;

        // 通过反向地理编码获取地址信息
        $.getJSON(`https://nominatim.openstreetmap.org/reverse?format=json&lat=${lat}&lon=${lon}`, function( object ) {
            
            let adress = object.address;
            
            $.ajax( {
                type: 'POST',
                url: localize._ajax_url,
                data: {
                    _ajax_nonce: localize._ajax_nonce,
                    action: '_wpso_73934145',
                    latitude: lat,
                    longitude: lon,
                    openStreetMapObject: adress,
                },
                success: function ( response ) {
                    console.log( response.data );
                },
            } );
        } );
    } );
};

信息展示模板代码(my-template.php)

$user_id = get_current_user_id();
$meta_key = '_user_position';

if ( metadata_exists( 'user', $user_id, $meta_key ) ) {

    $meta_value = get_user_meta( $user_id, $meta_key, true);
    //var_dump( $meta_value );
    //var_dump( $meta_value['openStreetMapObject']["ISO3166-2-lvl6"] );
    //echo $meta_value['openStreetMapObject']['county'];
    //echo $meta_value['openStreetMapObject']['country'];
    //var_dump( $meta_value['openStreetMapObject']['city_district'] );
    //echo $meta_value['openStreetMapObject']['city_district'] ;

    $mybrowser = $_SERVER['HTTP_USER_AGENT'];
    if (strpos(strtolower($mybrowser), "safari/") && strpos(strtolower($mybrowser), "opr/")) {
        // Opera浏览器
        $mybrowsername="Opera";
    } else if (strpos(strtolower($mybrowser), "safari/") && strpos(strtolower($mybrowser), "chrome/")) {
        // Chrome浏览器
        $mybrowsername="Chrome";
    } else if (strpos(strtolower($mybrowser), "msie")) {
        // IE浏览器
        $mybrowsername="Internet Explorer";
    } else if (strpos(strtolower($mybrowser), "firefox/")) {
        // Firefox浏览器
        $mybrowsername="Firefox";
    } else if (strpos(strtolower($mybrowser), "safari/") && strpos(strtolower($mybrowser), "opr/")==false && strpos(strtolower($mybrowser), "chrome/")==false) {
        // Safari浏览器
        $mybrowsername="Safari";
    } else {
        // 无法识别的浏览器
        $mybrowsername="未知浏览器";
    };
    echo $mybrowsername;
    echo $meta_value['openStreetMapObject']['county'];
    echo $meta_value['openStreetMapObject']['country'];
    echo $meta_value['openStreetMapObject']["ISO3166-2-lvl6"];

} else {
    echo '请分享你的地理位置信息';
};

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 09:15:41