Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save hazratbilal0079/3da685fae750ee75a95bd53619aaa711 to your computer and use it in GitHub Desktop.
Save hazratbilal0079/3da685fae750ee75a95bd53619aaa711 to your computer and use it in GitHub Desktop.
How to save session time for each user in WordPress, monitor it in real-time
Note:
Create two meta fields in the user profile. In my case, the slug for the daily timing meta field is "usersessiontime"
and for the lifetime meta field, it is "user_daily_time" and for monthly record metafield is "monthly_session_store".
In case i set the idol time 20 seconds.
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
jQuery(document).ready(function($) {
const IDLE_THRESHOLD = 10; // 3 minutes in seconds
let idleTime = 0;
let timerInterval = null;
let isIdle = false;
// Initialize session time and last activity from localStorage
if (!localStorage.getItem('sessionActiveTime')) {
localStorage.setItem('sessionActiveTime', '0');
}
if (!localStorage.getItem('lastActivityTime')) {
localStorage.setItem('lastActivityTime', Date.now());
}
// Function to format time as H:M:S
function formatTime(seconds) {
const h = Math.floor(seconds / 3600).toString().padStart(2, '0');
const m = Math.floor((seconds % 3600) / 60).toString().padStart(2, '0');
const s = (seconds % 60).toString().padStart(2, '0');
return `${h}:${m}:${s}`;
}
function startTimer() {
if (timerInterval === null) {
timerInterval = setInterval(function() {
if (!isIdle) {
// Update active time in localStorage
const activeTime = parseInt(localStorage.getItem('sessionActiveTime')) + 1;
localStorage.setItem('sessionActiveTime', activeTime.toString());
$('#session-time-display').text(formatTime(activeTime));
}
}, 1000);
}
}
function stopTimer() {
clearInterval(timerInterval);
timerInterval = null;
}
function checkIdleTime() {
idleTime += 1;
if (idleTime >= IDLE_THRESHOLD) {
isIdle = true;
stopTimer();
sendSessionTime(); // Save active time before going idle
}
}
function resetIdleTimer() {
idleTime = 0;
if (isIdle) {
// User was idle, now active again
isIdle = false;
startTimer();
}
localStorage.setItem('lastActivityTime', Date.now());
}
function sendSessionTime() {
const sessionActiveTime = parseInt(localStorage.getItem('sessionActiveTime'));
$.ajax({
url: myAjax.ajax_url,
type: 'POST',
data: {
action: 'update_user_session_time',
session_time: sessionActiveTime
},
success: function() {
localStorage.setItem('sessionActiveTime', '0'); // Reset local active time
}
});
}
// Monitor user activity across all tabs with a broader range of events
$(document).on('mousemove keypress scroll click contextmenu focus blur', resetIdleTimer);
// Start checking idle time every second
setInterval(checkIdleTime, 1000);
// Start the timer initially
startTimer();
// Send session time to the server every 5 minutes, even if idle
setInterval(function() {
sendSessionTime();
}, 300000);
// Handle tab focus and blur to potentially stop/resume counting time
$(window).on('focus', function() {
resetIdleTimer(); // Reset idle time when tab is focused
});
$(window).on('blur', function() {
// Consider stopping timer on blur only if not already idle
if (!isIdle) {
stopTimer();
}
});
});
</script>
// Enqueue JavaScript
function enqueue_session_timer_script() {
wp_enqueue_script('session-timer', get_template_directory_uri() . '/js/session-timer.js', array('jquery'), null, true);
wp_localize_script('session-timer', 'myAjax', array('ajax_url' => admin_url('admin-ajax.php')));
}
add_action('wp_enqueue_scripts', 'enqueue_session_timer_script');
// Handle AJAX Request
function update_user_session_time() {
if (is_user_logged_in() && isset($_POST['session_time'])) {
$user_id = get_current_user_id();
$current_time = (int)get_user_meta($user_id, 'usersessiontime', true);
$updated_time = $current_time + (int)$_POST['session_time'];
// Update session time in user meta
update_user_meta($user_id, 'usersessiontime', $updated_time);
// Update user_daily_time for lifetime
$user_daily_time = (int)get_user_meta($user_id, 'user_daily_time', true);
update_user_meta($user_id, 'user_daily_time', $user_daily_time + (int)$_POST['session_time']);
// Update monthly_session_store
$monthly_session_store = (int)get_user_meta($user_id, 'monthly_session_store', true);
update_user_meta($user_id, 'monthly_session_store', $monthly_session_store + (int)$_POST['session_time']);
}
wp_die();
}
add_action('wp_ajax_update_user_session_time', 'update_user_session_time');
// Shortcode to Display Session Time
function display_user_session_time() {
if (is_user_logged_in()) {
$user_id = get_current_user_id();
$session_time = (int)get_user_meta($user_id, 'usersessiontime', true);
$user_daily_time = (int)get_user_meta($user_id, 'user_daily_time', true);
$monthly_session_store = (int)get_user_meta($user_id, 'monthly_session_store', true);
// Convert time to H:i:s format
return "Today Time: " . gmdate('H:i:s', $session_time) . " - Lifetime: " . gmdate('H:i:s', $user_daily_time) . " - Monthly: " . gmdate('H:i:s', $monthly_session_store);
}
return 'Not logged in';
}
add_shortcode('user_session_time', 'display_user_session_time');
// Reset session time daily at midnight
if (!wp_next_scheduled('reset_daily_session_time')) {
wp_schedule_event(strtotime('midnight'), 'daily', 'reset_daily_session_time');
}
function reset_daily_session_time() {
$users = get_users();
foreach ($users as $user) {
update_user_meta($user->ID, 'usersessiontime', 0);
}
}
add_action('reset_daily_session_time', 'reset_daily_session_time');
// Reset monthly session store on the 2nd day of each month
if (!wp_next_scheduled('reset_monthly_session_store')) {
wp_schedule_event(strtotime('2nd day of this month'), 'monthly', 'reset_monthly_session_store');
}
function reset_monthly_session_store() {
$users = get_users();
foreach ($users as $user) {
update_user_meta($user->ID, 'monthly_session_store', 0);
}
}
add_action('reset_monthly_session_store', 'reset_monthly_session_store');
//Tag to display real time clock
<div id="session-time-display">00:00:00</div>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment