如何在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
相关产品推荐
相关产品推荐

