• 欢迎访问web前端中文站,JavaScript,CSS3,HTML5,web前端demo
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏web前端中文站吧

WordPress 禁止多人同时登录一个用户账号(代码版)

主机教程 web前端中文站 2年前 (2017-12-31) 804次浏览 已收录 0个评论

在 WordPress 的用户管理问题中发现 WordPress 有一个很头疼的问题,那就是,WordPress 居然可以多个人同事登陆一个账号,不知道目前的 4.8 版本是否还允许,这里也不在测试,直接分享一段代码,实现:WordPress 禁止多人同时登录一个用户账号

更多精彩内容请看 lisa 小站
http://www.lisashopmall.com 可按 Ctrl + D 进行收藏

WordPress 禁止多人同时登录一个用户账号

这里推荐的功能插件为:Prevent Concurrent Logins 和 Wp Single Login 点击即可直接下载。

如果你不想用插件,这里是代码版,添加到 function.php 即可:

以下分别为两个插件提取的代码版!

Prevent Concurrent Logins 提取

function pcl_user_has_concurrent_sessions() {  
return ( is_user_logged_in() && count( wp_get_all_sessions() ) > 1 ); } 
/**  * Get the user's current session array  *  * @return array  */ 
function pcl_get_current_session() {  
$sessions = WP_Session_Tokens::get_instance( get_current_user_id() );
return $sessions->get( wp_get_session_token() ); } 
/**  * Only allow one session per user  *  * 
If the current user's session has been taken over by a newer  
* session then we will destroy their session automattically and  
* they will have to login again to continue.  *  * 
@action init  *  * @return void  */ 
function pcl_disallow_account_sharing() {  
if ( ! pcl_user_has_concurrent_sessions() ) {   
return;  } 
$newest  = max( wp_list_pluck( wp_get_all_sessions(), 'login' ) );  
$session = pcl_get_current_session(); 
if ( $session['login'] === $newest ) {   
wp_destroy_other_sessions();  } else {   
wp_destroy_current_session();  } } 
add_action( 'init', 'pcl_disallow_account_sharing' );

Wp Single Login 提取

<?php /* Plugin name: WP Single Login Plugin URI: 
http://magnigenie.com/wp-single-login/ 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 = __( "Your session has been terminated as you are logged in from another 
browser." ) ;       
$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(); }

 

【注:本文源自网络文章资源,由站长整理发布】


web 前端中文站 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:WordPress 禁止多人同时登录一个用户账号(代码版)
喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址