Больше результатов...

Generic selectors
Только точные совпадения
Искать в заголовках
Искать в контенте
Post Type Selectors
Filter by Categories
FAQ
Hostenko
Вдохновение
Видеоуроки
Новости
Плагины
Темы
Уроки
Хаки

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

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

inet.ws - Powerful VPS Hosting in the USA, Canada, UK and DE!

Смотрите также:

Шаг 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().

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

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

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

Шаг 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
inet.ws - Powerful VPS Hosting in the USA, Canada, UK and DE!
Алексей Шевченко
редактор wpcafe
Изучает сайтостроение с 2008 года. Практикующий вебмастер, специализирующий на создание сайтов на WordPress. Задать вопрос Алексею можно на https://profiles.wordpress.org/wpthemeus/

Комментарии к записи: 6

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

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

WPcafe.org:

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

Kaliaka:

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

Сергей Владимирович:

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

Alex:

Очень круто, спасибо большое, все работает отлично!

Romario:

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

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