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

[lastview user_id=1]

当前用户

[lastview]

php调用

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

应用效果

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

或者 ● 最后上线:23 小时前 <=博主上次在线

后记

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

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇