WebTutorWordPressКак забанить пользователя WordPress

Как забанить пользователя WordPress

Возможно, вы интересовались когда-нибудь как забанить пользователя WordPress? И сейчас мы приведем пример того, как это можно сделать. Наиболее оптимальный вариант — это создать свой плагин, который будет работать с фильтрами WordPress, которые взаимодействуют с системой регистрации.

Возможно вас заинтересует еще темы:

Блокировка по IP для страницы авторизации WordPress сайта.

Усиление мер безопасности в WordPress — 1 Часть.

Усиление мер безопасности с помощью плагинов — 2 часть.

5 плагинов для безопасности сайта на WordPress.

Пишем плагин

Для этого создаем в папке wp-content/plugins подпапку с названием нашего будущего плагина, например, ban-users. А в этой папке главный файл плагина ban-users.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
*/

Добавляем чекбокс на страницу пользователя

Чекбокс нужен для того, чтобы отметить пользователя и тем самым запретить ему авторизацию на сайте. Этот отмеченный чекбокс сохранится в мета данных и в процессе авторизации это можно будет проверить. Добавим такой код ниже, который будет вызывать наши функции добавления чекбокса:

/**
 * 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' );

А вот сами функции, добавляющие чекбокс на страницу редактирования профиля пользователя.

/**
 * 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
}

Следующая функция будет сохранять состояние чекбокса в базу данных:

/**
 * 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-&gt;ID;
    if ( $current_user_id == $user_id ) {
        return;
    }
 
    // Lock
    if( isset( $_POST['rc_ban'] ) &amp;&amp; $_POST['rc_ban'] = 'on' ) {
        rc_ban_user( $user_id );
    } else { // Unlock
        rc_unban_user( $user_id );
    }
 
}

В новой функции, как это видно, применяются еще две функции, назначение которых понятно по их названию: rc_ban_users() и  rc_unban_users(). 

Первая блокирует пользователю возможность авторизации, а вторая — наоборот, снимает эту блокировку.

Блокирование пользователей

Создаем функцию rc_ban_users(). Здесь, перед тем, как сохранять значение чекбокса, который отвечает за бан пользователя, нужно проверить, не было ли оно сохранено ранее. Для этого используется еще одна функция, которая ниже также будет описана подробно — rc_is_user_banned().

/**
 * 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 );
    }
}

Функция разблокирования пользователя

Сейчас добавим совсем противоположную функцию, которая разблокирует пользователя.

/**
 * 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 );
    }
}

Заблокирован ли пользователь

Опишем функцию под названием rc_is_user_banned(), которая у нас использовалась ранее.

/**
 * 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 );
}

Эта функция возвращает значение опции, отвечающее за бан конкретного пользователя.

Запрет авторизации заблокированным пользователям

Теперь нам нужно привязать весь наш функционал к форме авторизации на сайте. Для реализации этого нам потребуется стандартный фильтр WordPress — wp_authenticate_user. К данному фильтру применим функцию rc_authenticate_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;
}

Теперь добавим фильтр:

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

Выводы

Мы создали простой плагин, который даст вам возможность блокировать неугодных пользователей сайта или провинившихся. Процесс бана довольно прост, нужно установить галку в профиле соответствующего юзера.

 

Просмотров: 141

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *