WordPress 如何禁止一个账号同时多人登录
本课程视频是VIP会员课程,学习请进入VIP学习区。
使用过DISCUZ做论坛的学员都知道,DISCUZ论坛有一个功能就是可以禁止同一帐号禁止多人重复登录。如果一个账号登录了,别人再登录就会自动退出另一个人的登录。这在一些带会员功能的网站上有非常实用的意义。
那么对于WordPress做网站,也是有这样的功能的,通代码可以检测到网站的一个账号是否有多人同时登录,如果有的话,就会将前面登录的用户退出。实现方法如下:
第一种方法:插件法
通过安装禁止多人登录WORDPRESS插件 Wp Single Login 来实现这样的功能。直接在网站后台插件安装界面搜索 Wp Single Login 即可在线安装启用即可,不需要任何的设置。
第二种方法:代码法
如果你不想用插件,或者想自定义某些代码,可以使用下面的代码,将下面的代码复制到你的网站模板函数文件functions.php里,保存即可。
<?php
/*
Plugin name: WP Single Login
Plugin URI: http://magnigenie.com/wp-single-login/
From: https://www.xuewangzhan.net/
Description: This plugin will automatically logout the already logged in user when a user with the same login details tries to login from different browser or different computer. This plugin needs zero configuration to run. Just install it if you want single login functionality on your site.
Version: 1.0
Author: Nirmal Ram
Author URI: http://magnigenie.com/about-me/
License: GPLv2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
*/
if( !class_exists( 'wp_single_login' ) ) {
class wp_single_login {
private $session_id;
function __construct() {
if ( ! session_id() )
session_start();
$this->session_id = session_id();
add_action( 'init', array( $this, 'wpsl_init' ) );
add_action( 'wp_login', array( $this, 'wpsl_login' ), 10, 2 );
add_filter('heartbeat_received', array( $this, 'wpsl_heartbeat_received' ), 10, 2);
add_filter('heartbeat_nopriv_received', array( $this, 'wpsl_heartbeat_received' ), 10, 2);
add_filter( 'login_message', array( $this, 'wpsl_loggedout_msg' ), 10 );
}
function wpsl_init() {
if( ! is_user_logged_in() )
return;
//enqueue the Heartbeat API
wp_enqueue_script('heartbeat');
wp_enqueue_script('jquery');
//load our Javascript in the footer
add_action("wp_footer", array( $this, 'wpsl_scripts' ) );
$user_sess_id = get_user_meta( get_current_user_id(), '_wpsl_hash', true );
if( $user_sess_id != $this->session_id ) {
wp_logout();
wp_redirect( site_url( 'wp-login.php?wpsl=loggedout' ) );
exit;
}
}
function wpsl_login( $user_login, $user ) {
update_user_meta( $user->ID, '_wpsl_hash', $this->session_id );
return;
}
function wpsl_loggedout_msg() {
if ( isset($_GET['wpsl']) && $_GET['wpsl'] == 'loggedout' ) {
$msg = __( "您的账号在其它地方登录,此处已强制下线!" ) ;
$message = '<p class="message">'.$msg.'</p><br />';
return $message;
}
}
function wpsl_heartbeat_received($response, $data) {
$user_sess_id = get_user_meta( get_current_user_id(), '_wpsl_hash', true );
if( $data['user_hash'] && $data['user_hash'] != $user_sess_id ){
$response['wpsl_response'] = 1;
wp_logout();
}else{
$response['wpsl_response'] = 0;
}
return $response;
}
function wpsl_scripts() { ?>
<script>
jQuery(document).ready(function() {
wp.heartbeat.interval( 'fast' );
//hook into heartbeat-send: and send the current session id to the server
jQuery(document).on('heartbeat-send', function(e, data) {
data['user_hash'] = '<?php echo $this->session_id; ?>'; //need some data to kick off AJAX call
});
//hook into heartbeat-tick: client looks for a 'server' var in the data array and logs it to console
jQuery(document).on( 'heartbeat-tick', function( e, data ) {
if( data['wpsl_response'] ){
alert( '<?php _e('Your session has been terminated as you are logged in from another browser.'); ?>' );
window.location.href='<?php echo site_url( 'wp-login.php?wpsl=loggedout' ); ?> ';
}
});
});
</script>
<?php
}
}
new wp_single_login();
}
?>