Last active
August 29, 2024 05:12
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//Shortcode to display record | |
[user_session_time] |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<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> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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'); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//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