WordPress主題純代碼實現禁止某些用戶賬號登錄,下面這段代碼主要實現用戶登錄時提示用戶該賬號已被禁用,如此簡單的問題,百度肯定有答案,果不其然,百度一番后找到可用代碼,不過確不能和前端匹配,于是簡單修改下DUX主題的登錄接口,實現效果如下。

全部功能分為兩部分,第一部分為WordPress禁止用戶登錄,下面看看實現代碼,為了大家使用方便,這里直接放插件代碼,當然,如果你想放在主題functions.php文件中也是沒有任何問題的。
禁止用戶登錄
<?php
//禁止某用戶登錄
//在資料頁面添加選項
function dmd_denied_admin_init(){
// 編輯用戶資料
add_action( 'edit_user_profile', 'dmd_denied_edit_user_profile' );
add_action( 'edit_user_profile_update', 'dmd_denied_edit_user_profile_update' );
}
add_action('admin_init', 'dmd_denied_admin_init' );
//在個人資料頁面添加一個復選框
function dmd_denied_edit_user_profile() {
if ( !current_user_can( 'edit_users' ) ) {
return;
}
global $user_id;
// 用戶不能禁止自己
$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="dmd_denied_ban"><input name="dmd_denied_ban" type="checkbox" id="dmd_denied_ban"
<?php if (dmd_denied_is_user_banned( $user_id )){echo 'checked="checked"';} ?> /> 禁止該用戶登陸!</label></td>
</tr>
</table>
<?php}
//添加一個函數來將這個選項的值保存到數據庫中
function dmd_denied_edit_user_profile_update() {
if ( !current_user_can( 'edit_users' ) ) {
return;
}
global $user_id;
// 用戶不能禁止自己
$current_user = wp_get_current_user();
$current_user_id = $current_user->ID;
if ( $current_user_id == $user_id ) {
return;
}
// 鎖定
if( isset( $_POST['dmd_denied_ban'] ) && $_POST['dmd_denied_ban'] = 'on' ) {
dmd_denied_ban_user( $user_id );
} else { // 解鎖
dmd_denied_unban_user( $user_id );
}
}
//禁止用戶
function dmd_denied_ban_user( $user_id ) {
$old_status = dmd_denied_is_user_banned( $user_id );
// 更新狀態
if ( !$old_status ) {
update_user_option( $user_id, 'dmd_denied_info', true, false );
}
}
//解禁用戶
function dmd_denied_unban_user( $user_id ) {
$old_status = dmd_denied_is_user_banned( $user_id );
// 更新狀態
if ( $old_status ) {
update_user_option( $user_id, 'dmd_denied_info', false, false );
}
}
//判斷用戶是否被禁止
function dmd_denied_is_user_banned( $user_id ) {
return get_user_option( 'dmd_denied_info', $user_id, false );
}
//阻止已禁止的用戶登錄
function dmd_denied_authenticate_user( $user ) {
if ( is_wp_error( $user ) ) {
return $user;
}
// 如果用戶被禁止,則返回錯誤提示
$banned = get_user_option( 'dmd_denied_info', $user->ID, false );
if ( $banned ) {
return new WP_Error( 'dmd_denied_info', __('該用戶被禁止登錄!如有疑問請聯系站長!', 'denied') );
}
return $user;
}
//將該函數掛載到 wp_authenticate_user 鉤子
add_filter( 'wp_authenticate_user', 'dmd_denied_authenticate_user', 1 );簡單解釋下wp_authenticate_user鉤子,它會在用戶登錄時篩選是否允許用戶進行身份驗證,禁止也就無法登錄了。
上面的代碼是完整的插件代碼,使用它你需要在你的插件目錄中新建一個文件夾,然后將上面的代碼保存為dmd_denied.php文件放在新建的文件夾里即可,當然還需要去WordPress后臺插件頁面啟用插件。
如果你不想使用插件,那么只需要將上面插件頭部結束后面的所有代碼全部復制到你的主題functions.php文件最后即可。
上面代碼生效后,隨便打開一個用戶的資料就可以看到一個禁止用戶登錄的選擇框,勾選即禁止登錄。
修改DUX主題登陸接口
dux主題的登錄接口文件在主題目錄下的action文件夾中的log.php文件中,將第56行到第61行內容(可能行號不準確,仔細對比)
$user_verify = wp_signon( $login_data, false );
if ( is_wp_error($user_verify) ){
print_r(json_encode(array('error'=>1, 'msg'=>'用戶名/郵箱或密碼錯誤')));
exit();
}改為
$user_verify = wp_signon( $login_data, false );
if ( is_wp_error($user_verify) ){
$errormsg=$user_verify->get_error_messages( 'dmd_denied_info' )[0];
if($errormsg){
print_r(json_encode(array('error'=>1, 'msg'=>$errormsg)));
exit();
}
print_r(json_encode(array('error'=>1, 'msg'=>'用戶名/郵箱或密碼錯誤')));
exit();
}到此DUX主題禁止指定用戶登錄的功能就做好了,其它主題也是一樣的邏輯,如果你的主題是使用的WordPress自帶的登錄頁,就不必做第二步修改主題登錄接口了,WordPress會自動解析wp_error錯誤信息提示用戶!






