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