Wordpress 记录登录日志

wordpress 记录登录日志


function get_client_ip() {  
    if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown")) {
        $ip = getenv("HTTP_CLIENT_IP");
    } else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"),  
"unknown")) {
        $ip = getenv("HTTP_X_FORWARDED_FOR"); 
    } else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown")) {
        $ip = getenv("REMOTE_ADDR");
    } else if (isset ($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR']  
&& strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))  {
        $ip = $_SERVER['REMOTE_ADDR']; 
    } else {
        $ip = "unknown";
    }
    return ($ip);  
}  

function hanada_user_login_message($user_login)
{
    global $user_ID;
    date_default_timezone_set(PRC);  // 纠正8小时时差
    $current_user = get_user_by( 'login', $user_login );//获取当前登录信息
    $login_date = date('Y-m-d H:i:s');//获取登录时间
    $login_ip = get_client_ip();//获取登录IP
    $login_addr_arr = json_decode(@file_get_contents('https://freeapi.ipip.net/'.$login_ip),true);//使用接口获得登录IP对应地理位置json数组并解码为php数组
    $login_addr = $login_addr_arr[0].$login_addr_arr[1].$login_addr_arr[2].$login_addr_arr[3].$login_addr_arr[4];//拼接地理位置
    $login_ua = $_SERVER['HTTP_USER_AGENT'];//获取UA
    $login_type = '密码';//标记登录类型为使用密码登录
    //将登录记录写入用户表
    if (empty(get_user_meta($current_user->ID,'login_num', true))) {
        update_user_meta($current_user->ID, 'login_num', 1);
        $login_message_arr = array(
            'login_num_1' => array( 'date' => '', 'ip' => '', 'addr' => '', 'ua' => '', 'type' => '' ),
            'login_num_2' => array( 'date' => '', 'ip' => '', 'addr' => '', 'ua' => '', 'type' => '' ),
            'login_num_3' => array( 'date' => '', 'ip' => '', 'addr' => '', 'ua' => '', 'type' => '' ),
            'login_num_4' => array( 'date' => '', 'ip' => '', 'addr' => '', 'ua' => '', 'type' => '' ),
            'login_num_5' => array( 'date' => '', 'ip' => '', 'addr' => '', 'ua' => '', 'type' => '' ),
            'login_num_6' => array( 'date' => '', 'ip' => '', 'addr' => '', 'ua' => '', 'type' => '' ),
            'login_num_7' => array( 'date' => '', 'ip' => '', 'addr' => '', 'ua' => '', 'type' => '' ),
            'login_num_8' => array( 'date' => '', 'ip' => '', 'addr' => '', 'ua' => '', 'type' => '' ),
            );
    } else if (get_user_meta($current_user->ID,'login_num', true) >= 8) {
        update_user_meta($current_user->ID, 'login_num', 1);
        $login_message_arr = get_user_meta($current_user->ID, 'login_message', true);
    }else {
        update_user_meta($current_user->ID, 'login_num', get_user_meta($current_user->ID,'login_num', true) + 1 );
        $login_message_arr = get_user_meta($current_user->ID, 'login_message', true);
    }
    $login_num = get_user_meta($current_user->ID,'login_num', true);
    $login_message_arr['login_num_'.$login_num]['date'] = $login_date;
    $login_message_arr['login_num_'.$login_num]['ip'] = $login_ip;
    $login_message_arr['login_num_'.$login_num]['addr'] = $login_addr;
    $login_message_arr['login_num_'.$login_num]['ua'] = $login_ua;
    $login_message_arr['login_num_'.$login_num]['type'] = $login_type;
    update_user_meta($current_user->ID, 'login_message', $login_message_arr);
}
add_action('wp_login','hanada_user_login_message');

function clrs_get_user_agent($useragent)
{
    $stitle = $sver = null;
    if(preg_match('/iPad/i',$useragent)){
        $stitle = 'iPad';
        if(preg_match('/CPU OS ([.<em>0-9a-zA-Z]+)/i',$useragent,$regmatch)) $sver = 'iOS '.str_replace('</em>','.',$regmatch[1]);
    }elseif(preg_match('/iPod/i',$useragent)){
        $stitle = 'iPod';
        if(preg_match('/iPhone OS ([.<em>0-9a-zA-Z]+)/i',$useragent,$regmatch)) $sver = 'iOS '.str_replace('</em>','.',$regmatch[1]);
    }elseif(preg_match('/iPhone/i',$useragent)&&!preg_match('/Windows Phone/i',$useragent)){
        $stitle = 'iPhone';
        if(preg_match('/iPhone OS ([.<em>0-9a-zA-Z]+)/i',$useragent,$regmatch)) $sver = 'iOS '.str_replace('</em>', '.', $regmatch[1]);
    }elseif(preg_match('/Windows Phone OS 7/i',$useragent)||preg_match('/ZuneWP7/i',$useragent)||preg_match('/WP7/i',$useragent)){
        $stitle = 'Windows Phone';
        $sver = '7';
    }elseif(preg_match('/Windows Phone OS 8.1/i',$useragent)||preg_match('/Windows Phone 8.1/i',$useragent)||preg_match('/WP8.1/i',$useragent)){
        $stitle = 'Windows Phone';
        $sver = '8.1';
    }elseif(preg_match('/Windows Phone OS 8/i',$useragent)||preg_match('/Windows Phone 8/i',$useragent)||preg_match('/WP8/i',$useragent)){
        $stitle = 'Windows Phone';
        $sver = '8';
    }elseif(preg_match('/Windows Phone 10/i',$useragent)||preg_match('/WP10/i',$useragent)){
        $stitle = 'Windows Phone';
        $sver = '10';
    }elseif(preg_match('/wp-windowsphone/i',$useragent)){
        $stitle = 'Windows Phone';
    }elseif(preg_match('/Android/i',$useragent)){
        $stitle = 'Android';
        if(preg_match('/Android[ |/]?([.0-9a-zA-Z]+)/i',$useragent,$regmatch)) $sver = $regmatch[1];
    }elseif(preg_match('/[^A-Za-z]Arch/i',$useragent)){
        $stitle = 'Arch Linux';
    }elseif(preg_match('/CentOS/i',$useragent)){
        $stitle = 'CentOS';
        if(preg_match('/.el([.0-9a-zA-Z]+).centos/i',$useragent,$regmatch)) $sver = $regmatch[1];
    }elseif(preg_match('/Debian/i',$useragent)){
        $stitle = 'Debian GNU/Linux';
    }elseif(preg_match('/Edubuntu/i',$useragent)){
        $stitle = 'Edubuntu';
        if(preg_match('/Edubuntu<a href="[.0-9a-zA-Z]+">/| </a>/i',$useragent,$regmatch)) $sver = $regmatch[1];
    }elseif(preg_match('/FreeBSD/i',$useragent)){
        $stitle = 'FreeBSD';
    }elseif(preg_match('/Kubuntu/i',$useragent)){
        $stitle = 'Kubuntu';
        if(preg_match('/Kubuntu<a href="[.0-9a-zA-Z]+">/| </a>/i',$useragent,$regmatch)) $sver = $regmatch[1];
    }elseif(preg_match('/Linux Mint/i',$useragent)){
        $stitle = 'Linux Mint';
        if(preg_match('/Linux Mint/([.0-9a-zA-Z]+)/i',$useragent,$regmatch)) $sver = $regmatch[1];
    }elseif(preg_match('/Lubuntu/i',$useragent)){
        $stitle = 'Lubuntu';
        if (preg_match('/Lubuntu<a href="[.0-9a-zA-Z]+">/| </a>/i',$useragent,$regmatch)) $sver = $regmatch[1];
    }elseif(preg_match('/Mac/i',$useragent)||preg_match('/Darwin/i',$useragent)){
        $stitle = 'Mac';
        if(preg_match('/Mac OS X/i',$useragent)||preg_match('/Mac OSX/i',$useragent)){
            if(preg_match('/Mac OS X/i',$useragent)){
                $sver = substr($useragent,strpos(strtolower($useragent),strtolower('OS X'))+4);
            }else{
                $sver = substr($useragent,strpos(strtolower($useragent),strtolower('OSX'))+3);
            }
            $sver = substr($sver,0,strpos($sver,')'));
            if(strpos($sver,';') > -1) $sver = substr($sver,0,strpos($sver,';'));
            $sver = str_replace('<em>','.',$sver);
            if($wpua_show_version==='simple'&&preg_match('/([0-9]+.[0-9]+)/i',$sver,$regmatch)) $sver = $regmatch[1];
            $sver = (empty($sver))?'OS X':"OS X $sver";
        }elseif(preg_match('/Darwin/i',$useragent)){
            $sver = 'OS Darwin';
        }else{
            $stitle = 'Macintosh';
        }
    }elseif(preg_match('/NetBSD/i',$useragent)){
        $stitle = 'NetBSD';
    }elseif(preg_match('/Nova/i',$useragent)){
        $stitle = 'Nova';
        if(preg_match('/Nova<a href="[.0-9a-zA-Z]+">/| </a>/i',$useragent,$regmatch)) $sver = $regmatch[1];
    }elseif(preg_match('/OpenBSD/i',$useragent)){
        $stitle = 'OpenBSD';
    }elseif(preg_match('/Red Hat/i',$useragent)||preg_match('/RedHat/i',$useragent)){
        $stitle = 'Red Hat';
        if(preg_match('/.el([._0-9a-zA-Z]+)/i',$useragent,$regmatch)){
            $stitle .= ' Enterprise Linux';
            $sver = str_replace('</em>','.',$regmatch[1]);
        }
    }elseif(preg_match('/Xubuntu/i',$useragent)){
        $stitle = 'Xubuntu';
        if(preg_match('/Xubuntu<a href="[.0-9a-zA-Z]+">/| </a>/i',$useragent,$regmatch)) $sver = $regmatch[1];
    }elseif(preg_match('/Ubuntu/i',$useragent)){
        $stitle = 'Ubuntu';
        if(preg_match('/Ubuntu<a href="[.0-9]+[.0-9a-zA-Z]+">/| </a>/i',$useragent,$regmatch)) $sver = $regmatch[1];
    }elseif(preg_match('/Unix/i',$useragent)){
        $stitle = 'Unix';
    }elseif(preg_match('/Linux/i',$useragent)){
        $stitle = 'Linux';
    }elseif(preg_match('/Windows/i',$useragent)||preg_match('/WinNT/i',$useragent)||preg_match('/Win32/i',$useragent)){
        $stitle = 'Windows';
        if(preg_match('/Windows NT 10.0/i',$useragent)||preg_match('/Windows NT 6.4/i',$useragent)){
            $sver = '10';
        }elseif(preg_match('/Windows NT 6.3/i',$useragent)){
            $sver = '8.1';
        }elseif(preg_match('/Windows NT 6.2/i',$useragent)){
            $sver = '8';
        }elseif(preg_match('/Windows NT 6.1/i',$useragent)){
            $sver = '7';
        }elseif(preg_match('/Windows NT 6.0/i',$useragent)){
            $sver = 'Vista';
        }elseif(preg_match('/Windows NT 5.2 x64/i',$useragent)){
            $sver = 'XP';
        }elseif(preg_match('/Windows NT 5.2/i',$useragent)){
            $sver = 'Server 2003';
        }elseif(preg_match('/Windows NT 5.1/i',$useragent)||preg_match('/Windows XP/i',$useragent)){
            $sver = 'XP';
        }elseif(preg_match('/Windows NT 5.01/i',$useragent)){
            $sver = '2000, Service Pack 1 (SP1)';
        }elseif(preg_match('/Windows NT 5.0/i',$useragent)||preg_match('/Windows NT5/i',$useragent)||preg_match('/Windows 2000/i',$useragent)){
            $sver = '2000';
        }elseif(preg_match('/Windows NT 4.0/i',$useragent)||preg_match('/WinNT4.0/i',$useragent)){
            $sver = 'NT 4.0';
        }elseif (preg_match('/Windows NT 3.51/i',$useragent)||preg_match('/WinNT3.51/i',$useragent)){
            $sver = 'NT 3.11';
        }elseif(preg_match('/Windows NT/i',$useragent)||preg_match('/WinNT/i',$useragent)){
            $sver = 'NT';
        }elseif(preg_match('/Windows 3.11/i',$useragent)||preg_match('/Win3.11/i',$useragent)||preg_match('/Win16/i',$useragent)){
            $sver = '3.11';
        }elseif(preg_match('/Windows 3.1/i',$useragent)){
            $sver = '3.1';
        }elseif(preg_match('/Windows 98; Win 9x 4.90/i',$useragent)||preg_match('/Win 9x 4.90/i',$useragent)||preg_match('/Windows ME/i',$useragent)){
            $sver = 'Millennium Edition (Windows Me)';
        }elseif(preg_match('/Win98/i',$useragent)){
            $sver = '98 SE';
        }elseif(preg_match('/Windows 98/i',$useragent)||preg_match('/Windows 4.10/i',$useragent)){
            $sver = '98';
        }elseif(preg_match('/Windows 95/i',$useragent)||preg_match('/Win95/i',$useragent)){
            $sver = '95';
        }elseif(preg_match('/Windows CE/i',$useragent)){
            $sver = 'CE';
        }elseif(preg_match('/WM5/i',$useragent)){
            $sver = 'Mobile 5';
        }elseif(preg_match('/WindowsMobile/i',$useragent)){
            $sver = 'Mobile';
        }else{
        }
    }
    $btitle = null;
    if(preg_match('/BonEcho/i',$useragent)){
        $btitle = 'BonEcho';
    }elseif(preg_match('/chromeframe/i',$useragent)){
        $btitle = 'Google Chrome Frame';
    }elseif(preg_match('/ChromePlus/i',$useragent)){
        $btitle = 'ChromePlus';
    }elseif(preg_match('/Chromium/i',$useragent)){
        $btitle = 'Chromium';
    }elseif(preg_match('/CrMo/i',$useragent)){
        $btitle = 'Chrome Mobile';
    }elseif(preg_match('/CriOS/i',$useragent)){
        $btitle = 'Chrome';
    }elseif(preg_match('/Galaxy/i',$useragent)&&!preg_match('/Chrome/i',$useragent)){
        $btitle = 'Galaxy';
    }elseif(preg_match('/GoBrowser/i',$useragent)){
        $btitle = 'GO Browser';
    }elseif(preg_match('/Google Wireless Transcoder/i',$useragent)){
        $btitle = 'Google Wireless Transcoder';
    }elseif(preg_match('/GreenBrowser/i',$useragent)){
        $btitle = 'GreenBrowser';
    }elseif(preg_match('/GSA/i',$useragent)&&preg_match('/Mobile/i',$useragent)){
        $btitle = 'Google Search App';
    }elseif(preg_match('/Lorentz/i',$useragent)){
        $btitle = 'Lorentz';
    }elseif(preg_match('/MiniBrowser/i',$useragent)){
        $btitle = 'MiniBrowser';
    }elseif(preg_match('/Minimo/i',$useragent)){
        $btitle = 'Minimo';
    }elseif(preg_match('/MiuiBrowser/i',$useragent)){
        $btitle = 'MIUI Browser';
    }elseif(preg_match('/Mosaic/i',$useragent)){
        $btitle = 'Mosaic';
    }elseif(preg_match('/MozillaDeveloperPreview/i',$useragent)){
        $btitle = 'Mozilla Developer Preview';
    }elseif(preg_match('/MQQBrowser/i',$useragent)||preg_match('/QQBrowser/i',$useragent)){
        $btitle = 'QQbrowser';
    }elseif(preg_match('/MultiZilla/i',$useragent)){
        $btitle = 'MultiZilla';
    }elseif(preg_match('/NokiaBrowser/i',$useragent)){
        $btitle = 'Nokia Browser';
    }elseif(preg_match('/OneBrowser/i',$useragent)){
        $btitle = 'OneBrowser';
    }elseif(preg_match('/Opera Mini/i',$useragent)){
        $btitle = 'Opera Mini';
    }elseif(preg_match('/Opera Mobi/i',$useragent)){
        $btitle = 'Opera Mobile';
    }elseif(preg_match('#Opera.([a-zA-Z0-9.]+)#i',$useragent,$matches)){
        $btitle = 'Opera';
        if(preg_match('/Edition ([ .<em>0-9a-zA-Z]+)/i',$useragent,$regmatch)){
            $btitle .= ' '.$regmatch[1];
        }elseif(preg_match('/Opera ([ ._0-9a-zA-Z]+)/i',$useragent,$regmatch)){
            $btitle .= ' '.$regmatch[1];
        }
    }elseif(preg_match('/SeaMonkey/i',$useragent)){
        $btitle = 'SeaMonkey';
    }elseif(preg_match('/Series60/i',$useragent)&&!preg_match('/Symbian/i',$useragent)){
        $btitle = 'Nokia Series60';
    }elseif(preg_match('/S60/i',$useragent)&&!preg_match('/Symbian/i',$useragent)){
        $btitle = 'Nokia S60';
    }elseif(preg_match('#SE 2([a-zA-Z0-9.]+)#i',$useragent,$matches)&&preg_match('/MetaSr/i',$useragent)){
        $btitle = 'Sogou Explorer';
    }elseif(preg_match('/Shiretoko/i',$useragent)){
        $btitle = 'Shiretoko';
    }elseif(preg_match('/SlimBrowser/i',$useragent)){
        $btitle = 'SlimBrowser';
    }elseif(preg_match('#SAMSUNG-(S.H-[a-zA-Z0-9</em>/.]+)#i',$useragent)){
        $btitle = "Samsung";
    }elseif(preg_match('/Songbird/i',$useragent)){
        $btitle = 'Songbird';
    }elseif(preg_match('/TheWorld/i',$useragent)){
        $btitle = 'TheWorld Browser';
    }elseif(preg_match('/Thunderbird/i',$useragent)){
        $btitle = 'Thunderbird';
    }elseif(preg_match('#TencentTraveler ([a-zA-Z0-9.]+)#i',$useragent)){
        $btitle = 'TT Explorer';
    }elseif(preg_match('/uBrowser/i',$useragent)&&!preg_match('/Chrome/i',$useragent)){
        $btitle = 'uBrowser';
    }elseif((preg_match('/Ubuntu; Mobile/i',$useragent)||preg_match('/Ubuntu; Tablet/i',$useragent)&&preg_match('/WebKit/i',$useragent))){
        $btitle = 'Ubuntu Web Browser';
    }elseif(preg_match('#UBrowser([a-zA-Z0-9.]+)#i',$useragent,$matches)){
        $btitle = 'UC Browser';
    }elseif(preg_match('#UCBrowser([a-zA-Z0-9.]+)#i',$useragent,$matches)){
        $btitle = 'UC Browser';
    }elseif(preg_match('#UC Browser([a-zA-Z0-9.]+)#i',$useragent,$matches)){
        $btitle = 'UC Browser';
    }elseif(preg_match('#UCWEB([a-zA-Z0-9.]+)#i',$useragent,$matches)){
        $btitle = 'UC Browser';
    }elseif(preg_match('/UltraBrowser/i',$useragent)){
        $btitle = 'UltraBrowser';
    }elseif(preg_match('/UP.Browser/i',$useragent)){
        $btitle = 'Openwave Mobile Browser';
    }elseif(preg_match('/UP.Link/i',$useragent)){
        $btitle = 'Openwave Mobile Browser';
    }elseif(preg_match('/AppleWebkit/i',$useragent,$matches)&&preg_match('/Android/i',$useragent)&&!preg_match('/Chrome/i',$useragent)){
        $btitle = 'Android Webkit';
    }elseif(preg_match('/WebExplorer/i',$useragent)){
        $btitle = 'Web Explorer';
    }elseif(preg_match('/Chrome/i',$useragent)&&preg_match('/Mobile/i',$useragent)&&(preg_match('/Version/i',$useragent)||preg_match('/wv/i',$useragent,$matches))){
        $btitle = 'WebView';
    }elseif(preg_match('/wp-android/i',$useragent)){
        $btitle = 'Wordpress App';
    }elseif(preg_match('/wp-blackberry/i',$useragent)){
        $btitle = 'wp-blackberry';
    }elseif(preg_match('/wp-iphone/i',$useragent)){
        $btitle = 'Wordpress App';
    }elseif(preg_match('/wp-nokia/i',$useragent)){
        $btitle = 'wp-nokia';
    }elseif(preg_match('/wp-webos/i',$useragent)){
        $btitle = 'wp-webos';
    }elseif(preg_match('/wp-windowsphone/i',$useragent)){
        $btitle = 'wp-windowsphone';
    }elseif(preg_match('/YaBrowser/i',$useragent)){
        $btitle = 'Yandex Browser';
    }elseif(preg_match('#Edge/([a-zA-Z0-9.]+)#i',$useragent,$matches)&&preg_match('/Chrome/i',$useragent)&&preg_match('/Safari/i',$useragent)){
        $btitle = 'Microsoft Edge';
    }elseif(preg_match('#Chrome/([a-zA-Z0-9.]+)#i',$useragent,$matches)){
        $btitle = 'Google Chrome';
    }elseif(preg_match('/Safari/i',$useragent)&&!preg_match('/Nokia/i',$useragent)){
        $btitle = 'Safari';
    }elseif(preg_match('/Nokia/i',$useragent)){
        $btitle = 'Nokia Web Browser';
    }elseif(preg_match('#(Firefox|Phoenix|Firebird|BonEcho|GranParadiso|Minefield|Iceweasel)/([a-zA-Z0-9.]+)#i',$useragent,$matches)){
        $btitle = 'Firefox';
    }elseif(preg_match('#360([a-zA-Z0-9.]+)#i',$useragent,$matches)){
        $btitle = '360Safe Explorer';
    }elseif(preg_match('/baidubrowser/i',$useragent)){
        $btitle = 'Baidu Browser';
    }elseif(preg_match('/ Spark/i',$useragent)){
        $btitle = 'Baidu Spark';
    }elseif(preg_match('/MSIE/i',$useragent)||preg_match('/Trident/i',$useragent)){
        $btitle = 'Internet Explorer';
    }
    if(!$stitle){
        $stitle = 'Unknown System';
    }
    if(!$btitle){
        $btitle = 'Unknown Browser';
    }
    return $sver ?  $stitle.' '.$sver.' '.$btitle :  $stitle.' '.$btitle;
}

function hanade_shotcode_login_message()
{
    //未登录时返回空值
    if (!is_user_logged_in()) {
        return null;
    }
    //获取登录记录信息
    $current_user = wp_get_current_user();
    $user_meta = get_user_meta($current_user->ID);
    //echo '<pre>';
    //print_r($user_meta);
    $login_num = get_user_meta($current_user->ID,'login_num', true);
    $login_message_arr = get_user_meta($current_user->ID,'login_message', true);
    
    // echo '<pre>';
    // print_r($login_num);
    // print_r($login_message_arr);
    // die;
    //正则替换隐藏IP地址后两位
    $login_ip_reg = '~(d+).(d+).(d+).(d+)~';
    //设置北京时间
    date_default_timezone_set("PRC");
    //获取当前cookie
    $cookie = wp_parse_auth_cookie( '', 'logged_in' );
    //获取当前账号sessions
    $sessions = wp_get_all_sessions();
    //格式化输出登录记录信息
    $login_message_table = '
<table class="login_message_table"><thead><tr>
            <th>时间</th>
            <th>IP地址</th>
            <th>地理位置</th>
            <th>登录设备</th>
            <th>登录方式</th>
        </tr></thead><tbody class="row-hover">';
    for( $i=$login_num; $i>0; $i-- ) {
        if(!empty($login_message_arr['login_num_'.$i]['date'])) {
            $login_message_table .= '
        <tr>
            <td class="login_message_date">'.$login_message_arr['login_num_'.$i]['date'].'</td>
            <td class="login_message_op">'.preg_replace($login_ip_reg, "$1.$2.*.*", $login_message_arr['login_num_'.$i]['ip']).'</td>
            <td class="login_message_addr">'.$login_message_arr['login_num_'.$i]['addr'].'</td>
            <td class="login_message_ua" title="'.$login_message_arr['login_num_'.$i]['ua'].'">'.clrs_get_user_agent($login_message_arr['login_num_'.$i]['ua']).'</td>
            <td class="login_message_type">'.$login_message_arr['login_num_'.$i]['type'];
            if ( strtotime($login_message_arr['login_num_'.$i]['date']) == $cookie['expiration'] - 1209600 || strtotime($login_message_arr['login_num_'.$i]['date']) == $cookie['expiration'] - 172800) {
                $login_message_table = $login_message_table.'<span class="current_session">当前登录</span></td></tr>';
            } else {
                $has_seesion = false;
                foreach ($sessions as $value) {
                    if( strtotime($login_message_arr['login_num_'.$i]['date']) == $value['login'] ){
                        $login_message_table = $login_message_table.'<span class="other_session">尚未登出</span></td></tr>';
                        $has_seesion = true;
                        break;
                    }
                }
                if( $has_seesion == false ) {
                    $login_message_table = $login_message_table.'<span class="loggedout_session">已经登出</span></td></tr>';
                }
            }
        }
    }
    for( $i=8; $i>$login_num; $i-- ) {
        if(!empty($login_message_arr['login_num_'.$i]['date'])){
                $login_message_table = $login_message_table.'
        <tr>
            <td class="login_message_date">'.$login_message_arr['login_num_'.$i]['date'].'</td>
            <td class="login_message_ip">'.preg_replace($login_ip_reg, "$1.$2.*.*", $login_message_arr['login_num_'.$i]['ip']).'</td>
            <td class="login_message_addr">'.$login_message_arr['login_num_'.$i]['addr'].'</td>
            <td class="login_message_ua" title="'.$login_message_arr['login_num_'.$i]['ua'].'">'.clrs_get_user_agent($login_message_arr['login_num_'.$i]['ua']).'</td>
            <td class="login_message_type">'.$login_message_arr['login_num_'.$i]['type'];
            if( strtotime($login_message_arr['login_num_'.$i]['date']) === $cookie['expiration'] - 1209600 || strtotime($login_message_arr['login_num_'.$i]['date'] ) == $cookie['expiration'] - 172800){
                $login_message_table = $login_message_table.'<span class="current_session">当前登录</span></td></tr>';
            }else{
                $has_seesion = false;
                foreach($sessions as $value){
                    if( strtotime($login_message_arr['login_num_'.$i]['date']) == $value['login'] ){
                        $login_message_table = $login_message_table.'<span class="other_session">尚未登出</span></td></tr>';
                        $has_seesion = true;
                        break;
                    }
                }
                if( $has_seesion == false ) $login_message_table = $login_message_table.'<span class="loggedout_session">已经登出</span></td></tr>';
            }
        }
    }
    $login_message_table = $login_message_table.'</tbody></table>';
    // $login_message_table .= '<p>111</p>';
    return $login_message_table;
}
add_shortcode('login_message', 'hanade_shotcode_login_message');

function insert_last_login( $login ) {
	global $user_id;
	date_default_timezone_set(PRC);
	$user = get_userdatabylogin( $login );
	//current_time( 'mysql' )
	update_user_meta( $user->ID, 'last_login', date('Y-m-d H:i:s') );
}
add_action( 'wp_login', 'insert_last_login' );
// 添加一个新栏目“上次登录” 
function add_last_login_column( $columns ) {
	$columns['last_login'] = '上次登录';
	return $columns;
}
add_filter( 'manage_users_columns', 'add_last_login_column' );
// 显示登录时间到新增栏目 
function add_last_login_column_value( $value, $column_name, $user_id ) {
	$user = get_userdata( $user_id );
	if ( 'last_login' == $column_name && $user->last_login ) {
        $value = get_user_meta( $user->ID, 'last_login', true);
    } else {
        $value = '从未登录';
    }
	return $value;
}
add_action( 'manage_users_custom_column', 'add_last_login_column_value', 10, 3 );

function jerry_display_dashboard() {
    $service_email = get_service_email();
    $default_service_email = get_option('deafult_service_email');
    $html = '
    <form action="#" method="post" enctype="multipart/form-data" name="op_form" id="op_form">
      <div class="wrap">
        <h2>当前站点选项</h2>
        <table>
           <tbody>
               <tr>
                   <td>default service email</td>
               </tr>
               <tr>
                   <td>
                        <input name="deafult_service_email" value="'.$deafult_service_email.'" id="deafult_service_email" style=" 300px;">
                   </td>
               </tr>
               <tr>
                   <td>service email</td>
               </tr>
               <tr>
                   <td>
                        <input name="site_service_email" value="'.$service_email.'" id="site_service_email" style=" 300px;">
                   </td>
               </tr>
           </tbody>
        </table>
        <div class="submit">
            <input type="submit" name="jerry_input_save" calue="save">
        </div>
      </div>
    </form>';
    echo $html;
    
    //未登录时返回空值
    if (!is_user_logged_in()) {
        return null;
    }
    //获取登录记录信息
    $current_user = wp_get_current_user();
    $user_id = $current_user->ID;
    if (1 === $user_id) {
        echo do_shortcode("[login_message]");
    }
}

function jerry_admin_init() {
    if ( isset($_POST['jerry_input_save']) ) {
        $options = get_option('site_service_email');
        $site_top_host = getTopHost();
        $options[$site_top_host] = trim($_POST['site_service_email']);
        update_option('site_service_email', $options);

        $deafult_service_email = trim($_POST['deafult_service_email']);
        update_option('deafult_service_email', $deafult_service_email);
    }
    add_theme_page("登录日志", "登录日志", "edit_themes", basename(__FILE__), 'jerry_display_dashboard');
}
add_action('admin_menu', "jerry_admin_init");
正因为来之不易,所以才有了后来的倍加珍惜。
原文地址:https://www.cnblogs.com/jjxhp/p/15213310.html