Несколько дней назад меня попросили создать систему, которая бы блокировала 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.

Надеюсь, эта возможность пригодится вам.

Источник: WPexplorer.com

Вам понравился материал?

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

Такой e-mail уже зарегистрирован. Воспользуйтесь формой входа или введите другой.

Вы ввели некорректные логин или пароль

Извините, для комментирования необходимо войти.

4 комментария

сначала новые
по рейтингу сначала новые по хронологии
Сергей Владимирович

Неплохо было бы добавить функцию в которой можно было выставить время на которое забанен юзверь. Например 24 часа, 48, 720 и т.д. Вот это была бы вещь. Я такой плагин ищу и нигде нету. Только вот ваш нашёл. Везде предлагают банить по айпи.

Спасибо, нужный инструмент!!!
от первоисточника выдал кучу ошибок, а Ваш заработал, пусть не совсем корректно, но мне было главное функционал. Если подскажите как исправить, то, что в профиле видно только окошко для галочки и ничего больше, а так же после установки галочки для блокировки, после обновления профиля галочка исчезает, неудобно в последствии при заходе на страницу пользователя не понятно, в бане он или нет. Было бы хорошо если бы галочка оставалась для визуального распознания.
Но уже то, что плагин работает очень меня порадовало, т.к. перерыл весь нет в поисках именно такого, еще раз спасибо!

Михаил Лисецкий

Ошибка.
В этом руководстве МИ поговорим о WordPress-фильтрах,

Исправили, спасибо!