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

Смотрите также:
Шаг 1. Создание плагина
Это несложно — все, что вам нужно сделать, это создать новую папку в wp-content/plugins под названием ban-users. В этой папке создайте новый файл под названием ban-users.php, откройте его и вставьте этот код:
<?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. Добавление чекбокса на странице пользователя
Первое, что нам нужно сделать — добавить чекбокс на каждую страницу редактирования профиля. Когда вы отметите этот чекбокс, он сохранит метаданные пользователя, которые будут показывать, что пользователю не разрешено больше авторизоваться на вашем сайте:
/**
* 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->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_users() и rc_unban_users(). Их имена в принципе достаточно понятно описывают суть функций: первая сохраняет в базу данных тот факт, что пользователь заблокирован, вторая — разблокирует пользователей.
Шаг 3. Блокирование пользователей
Теперь время создать функцию 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 );
}
}Шаг 4. Разблокирование пользователей
Следующая функция — прямая противоположность той, которую мы только что создали: нам нужна возможность "разблокировать" пользователей:
/**
* 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(), чтобы проверить, заблокирован ли пользователь. Давайте создадим ее:
/**
* 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().
Сейчас у нас есть новый чекбокс на странице редактирования пользователя, который должен быть таким:

Последний шаг — зацепить функцию за форму авторизации, чтобы не допустить авторизацию заблокированных пользователей.
Шаг 6. Запрет авторизации заблокированных пользователей
Чтобы это сделать, нам нужно использовать стандартный WordPress фильтр wp_authenticate_user. К этому фильтру мы зацепим функцию rc_authenticate_user(). Эта функция будет использовать класс WP_Error.
/**
* 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 );
Заключение
Мы создали плагин, который добавляет чекбокс на страницу редактирования пользователя. Мы использовали функцию для хранения значения чекбокса и создали функцию для блокировки WordPress пользователя и другую для разблокировки пользователя. Также мы создали маленькую функцию для проверки, заблокирован ли пользователь. И наконец, мы зацепили функцию за фильтр wp_authenticate_user, используя стандартный WordPress класс WP_Error.
Надеюсь, эта возможность пригодится вам.





















Комментарии к записи: 6
Ошибка.
В этом руководстве МИ поговорим о WordPress-фильтрах,
Исправили, спасибо!
Спасибо, нужный инструмент!!!
от первоисточника выдал кучу ошибок, а Ваш заработал, пусть не совсем корректно, но мне было главное функционал. Если подскажите как исправить, то, что в профиле видно только окошко для галочки и ничего больше, а так же после установки галочки для блокировки, после обновления профиля галочка исчезает, неудобно в последствии при заходе на страницу пользователя не понятно, в бане он или нет. Было бы хорошо если бы галочка оставалась для визуального распознания.
Но уже то, что плагин работает очень меня порадовало, т.к. перерыл весь нет в поисках именно такого, еще раз спасибо!
Неплохо было бы добавить функцию в которой можно было выставить время на которое забанен юзверь. Например 24 часа, 48, 720 и т.д. Вот это была бы вещь. Я такой плагин ищу и нигде нету. Только вот ваш нашёл. Везде предлагают банить по айпи.
Очень круто, спасибо большое, все работает отлично!
Всем привет! Плагин рабочий, спасибо! Только почему слетает галочка в чекбоксе? Никто не решил эту проблему? Было бы хорошо если бы галочка оставалась для визуального распознавания заблокирован пользователь или нет. Если есть умельцы, напишите пож решение в комментариях. За ранее спасибо!