Кілька днів тому мене попросили створити систему, яка б блокувала 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 і т.д. Оце була б річ. Я такий плагін шукаю і ніде нема. Тільки ваш знайшов. Скрізь пропонують банити по айпі.
Дуже круто, дякую, все працює відмінно!
Всім привіт! Плагін робітник, дякую! Тільки чому злітає галочка у чекбоксі? Ніхто не вирішив цієї проблеми? Було б добре, якби галочка залишалася для візуального розпізнавання заблокований користувач чи ні. Якщо є умільці, напишіть рішення в коментарях. Заздалегідь дякую!