WordPress主題純代碼實(shí)現(xiàn)禁止某些用戶賬號(hào)登錄,下面這段代碼主要實(shí)現(xiàn)用戶登錄時(shí)提示用戶該賬號(hào)已被禁用,如此簡單的問題,百度肯定有答案,果不其然,百度一番后找到可用代碼,不過確不能和前端匹配,于是簡單修改下DUX主題的登錄接口,實(shí)現(xiàn)效果如下。
全部功能分為兩部分,第一部分為WordPress禁止用戶登錄,下面看看實(shí)現(xiàn)代碼,為了大家使用方便,這里直接放插件代碼,當(dāng)然,如果你想放在主題functions.php文件中也是沒有任何問題的。
禁止用戶登錄
<?php //禁止某用戶登錄 //在資料頁面添加選項(xiàng) 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' ); //在個(gè)人資料頁面添加一個(gè)復(fù)選框 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>權(quán)限設(shè)置</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} //添加一個(gè)函數(shù)來將這個(gè)選項(xiàng)的值保存到數(shù)據(jù)庫中 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 ); // 更新狀態(tài) 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 ); // 更新狀態(tài) 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; } // 如果用戶被禁止,則返回錯(cuò)誤提示 $banned = get_user_option( 'dmd_denied_info', $user->ID, false ); if ( $banned ) { return new WP_Error( 'dmd_denied_info', __('該用戶被禁止登錄!如有疑問請(qǐng)聯(lián)系站長!', 'denied') ); } return $user; } //將該函數(shù)掛載到 wp_authenticate_user 鉤子 add_filter( 'wp_authenticate_user', 'dmd_denied_authenticate_user', 1 );
簡單解釋下wp_authenticate_user鉤子,它會(huì)在用戶登錄時(shí)篩選是否允許用戶進(jìn)行身份驗(yàn)證,禁止也就無法登錄了。
上面的代碼是完整的插件代碼,使用它你需要在你的插件目錄中新建一個(gè)文件夾,然后將上面的代碼保存為dmd_denied.php文件放在新建的文件夾里即可,當(dāng)然還需要去WordPress后臺(tái)插件頁面啟用插件。
如果你不想使用插件,那么只需要將上面插件頭部結(jié)束后面的所有代碼全部復(fù)制到你的主題functions.php文件最后即可。
上面代碼生效后,隨便打開一個(gè)用戶的資料就可以看到一個(gè)禁止用戶登錄的選擇框,勾選即禁止登錄。
修改DUX主題登陸接口
dux主題的登錄接口文件在主題目錄下的action文件夾中的log.php文件中,將第56行到第61行內(nèi)容(可能行號(hào)不準(zhǔn)確,仔細(xì)對(duì)比)
$user_verify = wp_signon( $login_data, false ); if ( is_wp_error($user_verify) ){ print_r(json_encode(array('error'=>1, 'msg'=>'用戶名/郵箱或密碼錯(cuò)誤'))); 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'=>'用戶名/郵箱或密碼錯(cuò)誤'))); exit(); }
到此DUX主題禁止指定用戶登錄的功能就做好了,其它主題也是一樣的邏輯,如果你的主題是使用的WordPress自帶的登錄頁,就不必做第二步修改主題登錄接口了,WordPress會(huì)自動(dòng)解析wp_error錯(cuò)誤信息提示用戶!