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

Загальні селектори
Тільки точні збіги
Шукати у заголовках
Шукати у контенті
Вибір типів постів
Фільтрувати за категоріями
FAQ
Hostenko
Натхнення
Відео уроки
Новини
Плагіни
теми
Уроки
Хакі

Кілька днів тому мене попросили створити систему, яка б блокувала WordPress користувача відразу ж при установці. Отже, я створив простий плагін і хочу поділитися з вами основами цього плагіна. У цьому посібнику ми поговоримо про WordPress-фільтри, управління користувачами та про деякі інші цікаві речі.

Як забанити користувача WordPress

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

Коментарі до запису: 6

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

Помилка.
У цьому посібнику МІ поговоримо про WordPress-фільтри,

WPcafe.org:

Виправили, дякую!

Kaliaka:

Дякую, потрібний інструмент!
від першоджерела видав купу помилок, а Ваш заробив, нехай не зовсім коректно, але мені було головне функціонал. Якщо підкажіть як виправити, то, що у профілі видно тільки віконце для галочки і нічого більше, а так само після встановлення галочки для блокування, після оновлення профілю галочка зникає, незручно після заходу на сторінку користувача не зрозуміло, в лазні він чи ні . Було б добре, якби галочка залишалася для візуального розпізнавання.
Але те, що плагін працює дуже мене порадувало, т.к. перерив весь немає в пошуках саме такого, ще раз дякую!

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

Непогано було б додати функцію в якій можна було виставити час, на який забанен юзвер. Наприклад, 24 години, 48, 720 і т.д. Оце була б річ. Я такий плагін шукаю і ніде нема. Тільки ваш знайшов. Скрізь пропонують банити по айпі.

Alex:

Дуже круто, дякую, все працює відмінно!

Romario:

Всім привіт! Плагін робітник, дякую! Тільки чому злітає галочка у чекбоксі? Ніхто не вирішив цієї проблеми? Було б добре, якби галочка залишалася для візуального розпізнавання заблокований користувач чи ні. Якщо є умільці, напишіть рішення в коментарях. Заздалегідь дякую!

Додати коментар або відгук