I wrote this function that allows the user to view the date of the last login (not the current login). Now I would also like to show the location and device with which the login was made. I tried to search but could not find any solution to my problem. Can anyone shed some light on this? I appreciate any help.
// Function that set last login
add_action('wp_login', 'set_last_login', 0, 2);
function set_last_login($login, $user) {
$user = get_user_by('login',$login);
$time = current_time( 'timestamp' );
$last_login = get_user_meta( $user->ID, '_last_login', 'true' );
if(!$last_login) {
update_user_meta( $user->ID, '_last_login', $time );
}
else {
update_user_meta( $user->ID, '_last_login_prev', $last_login );
update_user_meta( $user->ID, '_last_login', $time );
}
}
// Function that get last login
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;
}
2
Answers
Detect Location:
You might want to consider using the HTML5 Geolocoation API.
Otherwise, the IP may tell you something about the location:
How to get Real IP from Visitor?
Other options for location detection includes:
Geolocator-PHP
Google Geocoding API
Maxmind (php)
Detect Device:
https://github.com/serbanghita/Mobile-Detect/
https://www.codexworld.com/mobile-device-detection-in-php/
http://mobiledetect.net/
A bit of context, location is "Accept to share" based, on browsers (at least on desktop), meaning after a prompt from the browser, you (the user) need to accept to share your location.
You should be able to get the latitude and longitude through javascript via the Location Web API and then get the adress from the Nominatim OpenStreetMap API.
We could then pass everything to PHP through ajax and store it as a user metadata.
Basic example
Retrieving the user location
First thing first, to use Ajax we need jQuery. We also need to pass the Ajax url to our script to be able to process the request. We will also need to pass Nonce for security reason. This is done through the
wp_localize_script()
function.As we said before, we can use the Nominatim OpenStreetMap API, which is free (currently end of 2022), to reverse the location based on the latitude and longitude, and send the result to our backend for processing.
Our javascript ajax request needs to be answered by our PHP action function which will trigger our update_user_meta() function.
On the front end we can access our metadata through
get_user_meta()
.Retrieving the user device
In regards to the device we can retrieve the user agent. To decrypt the user agent and understand what it stand for I would suggest reading the Mozzila User-Agent developer documentation guide.
Alternatives
Reverse search the user IP which would let us retrieve the user approximate location without prompting them.