699 字
3 分钟
WordPress用户上次在线(浏览文章)时间
2025-02-22
无标签

前言#

之前用Typecho+MyDiary主题的时候发现他有个博主上次在线时间的功能,觉得挺好玩,换到Argon发现没有。查了查也只有上次登陆时间统计,也就是说只要你没有手动注销再登陆他就永远不会更新。

没办法,自己动手吧…

用处#

可以看用户活跃度(WordPress后台->用户->按在线时间排序)或者显示博主上次在线时间

原理#

和前文提到的登陆时间统计一样,都是hook,然后记录数据库。不同的是他们是hook登陆的操作,我是访问页面。

每5分钟记录一次,防止轰炸数据库。

代码#

add_action( \'template_redirect\', \'smartwp_capture_page_view_time\' );
function smartwp_capture_page_view_time() {
if ( ! is_user_logged_in() ) {
return;
}
$user_id = get_current_user_id();
$last_page_view = get_user_meta( $user_id, \'last_page_view\', true );
if ( empty($last_page_view) || (time() - $last_page_view) > 300 ) { // 5分钟=300秒,可以自己适当修改,别太短
update_user_meta( $user_id, \'last_page_view\', time() );
}
}
add_filter( \'manage_users_columns\', \'smartwp_user_last_view_column\' );
add_filter( \'manage_users_custom_column\', \'smartwp_last_view_column\', 10, 3 );
function smartwp_user_last_view_column( $columns ) {
$columns[\'last_page_view\'] = \'最后浏览时间\';
return $columns;
}
function smartwp_last_view_column( $output, $column_id, $user_id ){
if( $column_id == \'last_page_view\' ) {
$last_view = get_user_meta( $user_id, \'last_page_view\', true );
$date_format = \'M j, Y\';
$hover_date_format = \'F j, Y, g:i a\';
$output = \'<div class=\"last-view-meta\">\';
if ( $last_view ) {
if ( (time() - $last_view) <= 300 ) {
$output .= \'<span style=\"color:#4CAF50;\">●</span> 在线\';
} else {
$output .= \'<span style=\"color:#9E9E9E;\">●</span> 最后上线: \' . human_time_diff( $last_view ) . \' 前\';
}
} else {
$output .= \'无记录\';
}
$output .= \'</div>\';
}
return $output;
}
// 短代码
add_filter( \'manage_users_sortable_columns\', \'smartwp_sortable_last_view_column\' );
add_action( \'pre_get_users\', \'smartwp_sort_last_view_column\' );
function smartwp_sortable_last_view_column( $columns ) {
return wp_parse_args( array(
\'last_page_view\' => \'last_page_view\'
), $columns );
}
function smartwp_sort_last_view_column( $query ) {
if( !is_admin() ) {
return $query;
}
$screen = get_current_screen();
if( isset( $screen->base ) && $screen->base !== \'users\' ) {
return $query;
}
if( isset( $_GET[ \'orderby\' ] ) && $_GET[ \'orderby\' ] == \'last_page_view\' ) {
$query->query_vars[\'meta_key\'] = \'last_page_view\';
$query->query_vars[\'orderby\'] = \'meta_value\';
}
return $query;
}
function smartwp_lastview_shortcode( $atts ) {
$atts = shortcode_atts(
array(
\'user_id\' => get_current_user_id(),
\'label\' => \'\',
), $atts, \'lastview\' );
$user_id = absint( $atts[\'user_id\'] );
$user = get_user_by( \'id\', $user_id );
if ( ! $user ) {
return \'<span style=\"color:red;\">用户不存在</span>\';
}
$last_view = get_user_meta( $user_id, \'last_page_view\', true );
$current_time = time();
// 判断在线
$is_online = ( $current_time - $last_view ) <= 300;
$online_text = $atts[\'label\'] ? $atts[\'label\'] : \'● 在线\';
$offline_text = $atts[\'label\'] ? \'● 最后上线:\' . human_time_diff( $last_view ) . \'前\' : \'● 最后上线:\' . human_time_diff( $last_view ) . \'前\';
$output = \'<span class=\"user-status\">\';
if ( $is_online ) {
$output .= \'<span class=\"online-status online\" title=\"在线\"></span> \';
$output .= \'<strong style=\"color:#4CAF50;\">\' . $online_text . \'</strong>\';
} else {
$output .= \'<span class=\"online-status offline\" title=\"离线\"></span> \';
$output .= \'<strong style=\"color:#9E9E9E;\">\' . $offline_text . \'</strong>\';
}
$output .= \'</span>\';
return $output;
}
add_shortcode( \'lastview\', \'smartwp_lastview_shortcode\' );

短代码调用#

指定用户id#

[noshortcode]

[lastview user_id=1]

[/noshortcode]

当前用户#

[noshortcode]

[lastview]

[/noshortcode]

php调用#

[noshortcode]

<?php echo do_shortcode(\"[lastview user_id=1]\"); ?>

[/noshortcode]

应用效果#

本校站点概述显示的是博主的上次在线时间。

或者[lastview user_id=1] <=博主上次在线

后记#

我是今天才知道短代码在代码块里也会被解析…写完文章翻到调用示例一看三个在线我人都傻了

WordPress用户上次在线(浏览文章)时间
https://lumine.top/posts/2025-02-22-wp-user-active-time/
作者
Lumine
发布于
2025-02-22
许可协议
CC BY-NC-SA 4.0
评论