699 字
3 分钟
WordPress用户上次在线(浏览文章)时间
前言
之前用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/ 评论