Warning: Undefined array key "pl" in /home/host1693024/word-press.day/htdocs/www/875348534534.php on line 1655
Jak zablokować użytkownika WordPressa

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