Jak zablokować użytkownika WordPressa
Kilka dni temu poproszono mnie o utworzenie systemu, który blokowałby instalację WordPressa użytkownikowi. Stworzyłem więc prostą wtyczkę i chciałem podzielić się z Wami podstawami tej wtyczki. W tym samouczku omówimy filtry WordPress, akcje, zarządzanie kolumnami użytkowników i kilka innych świetnych rzeczy.
Krok 1: Utwórz wtyczkę
Ponownie, tutaj jest to bardzo skomplikowane, wystarczy utworzyć nowy folder z „wp-content/plugins” o nazwie „ban-users”. W tym folderze utwórz nowy plik o nazwie „ban-users.php”, otwórz go i wklej ten kod:
<?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
*/Krok 2: Dodaj pole wyboru na stronie profilu użytkownika
Pierwszą rzeczą, którą musimy zrobić, to dodać checkbox na każdej stronie edycji profilu użytkownika. Gdy zaznaczysz to pole wyboru, zostanie przechowana meta opcja użytkownika, która wskaże, że użytkownik nie może już logować się do Twojej witryny.
Oto kod:
/**
* 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' );Ten kod po prostu tworzy wywołanie funkcji, którą musimy teraz utworzyć. Ta funkcja doda pole wyboru do strony profilu użytkownika.
/**
* 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;
}
// Check if enabled
$checked = checked( get_user_option( 'rc_banned', $user_id, false ) );
// Display checkbox
echo '<table class="form-table">
<tr>
<th scope="row">Ban User</th>
<td>
<label for="rc_ban">
<input name="rc_ban" type="checkbox" id="rc_ban" '. $checked .' />Ban this user</label>
</td>
</tr>
</table>';
}Musimy teraz mieć funkcję, która zapisze do bazy danych wartość checkboxa:
/**
* 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 );
}
}Jak widać, ta nowa funkcja wykorzystuje dwie inne funkcje: rc_ban_users() i rc_unban_users(). Ich nazwy są dość jednoznaczne, pierwsza przechowuje w bazie danych informację o zablokowaniu użytkownika, druga odblokowuje użytkowników.
Krok 3: Zablokuj użytkowników
Nadszedł czas na utworzenie funkcji rc_ban_users(). W tej funkcji musimy sprawdzić, czy wartość jest już zapisana, a jeśli nie, musimy ją zapisać. Właśnie dlatego wywołuję funkcję, którą opiszę później: 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 );
}
}Krok 4: Odblokuj użytkowników
Następująca funkcja jest odwrotnością tej, którą właśnie stworzyliśmy: musimy dać możliwość „odbanowania” użytkowników:
/**
* 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 );
}
}Krok 5: Czy użytkownik został zbanowany?
W rc_ban_users() i rc_unban_users() widzieliśmy, że używamy funkcji o nazwie rc_is_user_banned(), aby sprawdzić, czy użytkownik jest zbanowany, czy nie. Stwórzmy to:
/**
* 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 );
}Zasadniczo ta funkcja po prostu zwraca wartość opcji zapisanej w rc_ban_users().
W tej chwili na stronie wersji użytkownika mamy nowe pole wyboru, które powinno się spodobać:
Ostatnim krokiem jest podłączenie funkcji do formularza logowania, aby uniknąć logowania zbanowanych użytkowników.
Krok 5: Unikaj logowania zbanowanych użytkowników
Aby to zrobić, musimy użyć domyślnego filtra WordPress o nazwie „wp_authenticate_user”. Do tego filtra podłączymy funkcję o nazwie „rc_authenticate_user()”. Ta funkcja będzie używać klasy 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;
}Teraz wystarczy dodać filtr:
add_filter( 'wp_authenticate_user', 'rc_authenticate_user', 1 );Stworzyliśmy wtyczkę, która dodaje checkbox do strony edycji profilu użytkownika. Użyliśmy drugiej funkcji do przechowywania wartości w polu wyboru i stworzyliśmy funkcję blokowania użytkownika WordPressa, a drugą do odblokowania użytkownika. Stworzyliśmy także małą funkcję sprawdzającą, czy użytkownik jest zbanowany, czy nie. I w końcu podłączyliśmy funkcję do filtra „wp_authenticate_user”, używając domyślnej klasy WP_Error WordPress.
Pobierz pełny kod na Githubie

