WordPress 禁止某些用戶登錄

本文目錄1步驟1:創建一個外掛2步驟2:在資料頁面添加選項3步驟3:禁止用戶4步驟4:解禁用戶5步驟5:判斷用戶是否被禁止6步驟6:阻止已禁止的用戶登錄

在某些特殊情況下,比如某些用戶損害瞭網站的利益,你可能就需要禁止他們登錄網站。禁止後,他們登錄時將顯示某些提示信息:

disable-user-wpdaxue_com

要實現類似的效果,伸手黨可以直接下載安裝 Disable Users 或者 User Control ,折騰黨可以參考下面的教程自己做一個外掛。

在下面的教程中,我們將一步步講解外掛的實現步驟,其中涉及到一些wp鉤子和用戶管理欄目的一些操作。

步驟1:創建一個外掛

在 wp-content/plugins 目錄創建一個名為“ban-users”的文件夾,然後在裡面新建一個名為 ban-users.php 的php文件,在文件頭部添加下面的代碼:

1
2
3
4
5
6
7
8
9
<?php
/*
Plugin Name: Ban Users
Plugin URI: http://www.remicorson.com
Description: Allows you to ban users
Author: Remi Corson
Version: 1.0
Author URI: http://www.remicorson.com
*/

<?php
/*
Plugin Name: Ban Users
Plugin URI: http://www.remicorson.com
Description: Allows you to ban users
Author: Remi Corson
Version: 1.0
Author URI: http://www.remicorson.com
*/

步驟2:在資料頁面添加選項

我們需要在用戶的個人資料頁面添加一個復選框,用來設置是否禁止該用戶登錄。繼續在上面的文件中添加下面的代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
 * Admin init
 *
 * @access      public
 * @since       1.0 
 * @return      void
*/
function rc_admin_init(){
 
	// Edit user profile
	add_action( 'edit_user_profile', 'rc_edit_user_profile' );
	add_action( 'edit_user_profile_update', 'rc_edit_user_profile_update' );
 
}
add_action('admin_init', 'rc_admin_init' );

/**
* Admin init
*
* @access public
* @since 1.0
* @return void
*/
function rc_admin_init(){
// Edit user profile
add_action( ‘edit_user_profile’, ‘rc_edit_user_profile’ );
add_action( ‘edit_user_profile_update’, ‘rc_edit_user_profile_update’ );
}
add_action(‘admin_init’, ‘rc_admin_init’ );

上面的代碼是用來將下面的兩個函數掛載到對應的動作鉤子。接下來,我們創建一個函數在個人資料頁面添加一個復選框:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
 * Adds custom checkbox to user edition page
 *
 * @access      public
 * @since       1.0 
 * @return      void
*/
function rc_edit_user_profile() {
	if ( !current_user_can( 'edit_users' ) ) {
		return;
	}
 
	global $user_id;
 
	// User cannot disable itself
	$current_user = wp_get_current_user();
	$current_user_id = $current_user->ID;
	if ( $current_user_id == $user_id ) {
		return;
	}
	?>
	<h3></h3>
	<table class="form-table">
	<tr>
		<th scope="row"></th>
		<td><label for="rc_ban"><input name="rc_ban" type="checkbox" id="rc_ban"  /> </label></td>
	</tr>
	</table>
	<?php
}

/**
* Adds custom checkbox to user edition page
*
* @access public
* @since 1.0
* @return void
*/
function rc_edit_user_profile() {
if ( !current_user_can( ‘edit_users’ ) ) {
return;
}
global $user_id;
// User cannot disable itself
$current_user = wp_get_current_user();
$current_user_id = $current_user->ID;
if ( $current_user_id == $user_id ) {
return;
}
?>
<h3></h3>
<table class="form-table">
<tr>
<th scope="row"></th>
<td><label for="rc_ban"><input name="rc_ban" type="checkbox" id="rc_ban" /> </label></td>
</tr>
</table>
<?php
}

然後再添加一個函數來將這個選項的值保存到數據庫中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
 * Save custom checkbox
 *
 * @access      public
 * @since       1.0 
 * @return      void
*/
function rc_edit_user_profile_update() {
 
	if ( !current_user_can( 'edit_users' ) ) {
		return;
	}
 
	global $user_id;
 
	// User cannot disable itself
	$current_user    = wp_get_current_user();
	$current_user_id = $current_user->ID;
	if ( $current_user_id == $user_id ) {
		return;
	}
 
	// Lock
	if( isset( $_POST['rc_ban'] ) && $_POST['rc_ban'] = 'on' ) {
		rc_ban_user( $user_id );
	} else { // Unlock
		rc_unban_user( $user_id );
	}
 
}

/**
* Save custom checkbox
*
* @access public
* @since 1.0
* @return void
*/
function rc_edit_user_profile_update() {
if ( !current_user_can( ‘edit_users’ ) ) {
return;
}
global $user_id;
// User cannot disable itself
$current_user = wp_get_current_user();
$current_user_id = $current_user->ID;
if ( $current_user_id == $user_id ) {
return;
}
// Lock
if( isset( $_POST[‘rc_ban’] ) && $_POST[‘rc_ban’] = ‘on’ ) {
rc_ban_user( $user_id );
} else { // Unlock
rc_unban_user( $user_id );
}
}

正如你上面看到的一樣,添加瞭兩個函數 rc_ban_user() 和 rc_unban_user() ,前者是用來禁止用戶,後者是解禁用戶。下面我們將來完善這兩個函數。

步驟3:禁止用戶

現在我們可以創建一個 rc_ban_user() 來禁止用戶,當然瞭,首先我們需要判斷一下,是否該選項的值已經保存,如果沒有,我們就需要保存這個值。所以我們下面還需要添加一個 rc_is_user_banned() 函數判斷用戶是否被禁止登錄。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
 * Ban user
 *
 * @access      public
 * @since       1.0 
 * @return      void
*/
function rc_ban_user( $user_id ) {
 
	$old_status = rc_is_user_banned( $user_id );
 
	// Update status
	if ( !$old_status ) {
		update_user_option( $user_id, 'rc_banned', true, false );
	}
}

/**
* Ban user
*
* @access public
* @since 1.0
* @return void
*/
function rc_ban_user( $user_id ) {
$old_status = rc_is_user_banned( $user_id );
// Update status
if ( !$old_status ) {
update_user_option( $user_id, ‘rc_banned’, true, false );
}
}

步驟4:解禁用戶

下面的函數和上面的更好相反,是用來解禁用戶的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
 * Un-ban user
 *
 * @access      public
 * @since       1.0 
 * @return      void
*/
function rc_unban_user( $user_id ) {
 
	$old_status = rc_is_user_banned( $user_id );
 
	// Update status
	if ( $old_status ) {
		update_user_option( $user_id, 'rc_banned', false, false );
	}
}

/**
* Un-ban user
*
* @access public
* @since 1.0
* @return void
*/
function rc_unban_user( $user_id ) { $old_status = rc_is_user_banned( $user_id );
// Update status
if ( $old_status ) {
update_user_option( $user_id, ‘rc_banned’, false, false );
}
}

步驟5:判斷用戶是否被禁止

在上面的 rc_ban_users() 和 rc_unban_users() 這兩個函數中,我們都調用瞭一個叫 rc_is_user_banned() 的函數用來判斷用戶是否被禁止,所以我們下面就要完善這個函數:

1
2
3
4
5
6
7
8
9
10
/**
 * Checks if a user is already banned
 *
 * @access      public
 * @since       1.0 
 * @return      void
*/
function rc_is_user_banned( $user_id ) {
	return get_user_option( 'rc_banned', $user_id, false );
}

/**
* Checks if a user is already banned
*
* @access public
* @since 1.0
* @return void
*/
function rc_is_user_banned( $user_id ) {
return get_user_option( ‘rc_banned’, $user_id, false );
}

基本上,這個函數隻是返回保存在 rc_ban_users() 上的值。

現在我們已經可以在編輯用戶的頁面看到添加的設置選項瞭:

ban-user-wpdaxue_com

我們還需要最後一步,限制被禁止的用戶登錄網站。

步驟6:阻止已禁止的用戶登錄

要實現這個功能,我們需要用到 wp_authenticate_user 鉤子,現在我們創建一個 rc_authenticate_user() 函數:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
 * Check if user is locked while login process
 *
 * @access      public
 * @since       1.0 
 * @return      void
*/
function rc_authenticate_user( $user ) {
 
	if ( is_wp_error( $user ) ) {
		return $user;
	}
 
	// Return error if user account is banned
	$banned = get_user_option( 'rc_banned', $user->ID, false );
	if ( $banned ) {
		return new WP_Error( 'rc_banned', __('<strong>ERROR</strong>: This user account is disabled.', 'rc') );
	}
 
	return $user;
}

/**
* Check if user is locked while login process
*
* @access public
* @since 1.0
* @return void
*/
function rc_authenticate_user( $user ) { if ( is_wp_error( $user ) ) {
return $user;
}
// Return error if user account is banned
$banned = get_user_option( ‘rc_banned’, $user->ID, false );
if ( $banned ) {
return new WP_Error( ‘rc_banned’, __(‘<strong>ERROR</strong>: This user account is disabled.’, ‘rc’) );
}
return $user;
}

然後將該函數掛載到 wp_authenticate_user 鉤子:

1
add_filter( 'wp_authenticate_user', 'rc_authenticate_user', 1 );

add_filter( ‘wp_authenticate_user’, ‘rc_authenticate_user’, 1 );

到這裡,整個外掛就完成瞭。

你可以在編輯用戶的界面,設置是否禁止用戶,如果該用戶被禁止瞭,他就無法登錄,同時顯示提示信息。ERROR : This user account is disabled.

參考資料:http://www.wpexplorer.com/how-to-ban-a-wordpress-user/

發佈留言