前言
之前用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
[lastview user_id=1]
当前用户
[lastview]
php调用
<?php echo do_shortcode("[lastview user_id=1]"); ?>
应用效果
本校站点概述显示的是博主的上次在线时间。
或者 ● 最后上线:23 小时前 <=博主上次在线
后记
我是今天才知道短代码在代码块里也会被解析......写完文章翻到调用示例一看三个在线我人都傻了