Me pediram alguns dias atrás para criar um sistema que baniria um usuário do WordPress de uma instalação. Então eu criei um plugin simples e queria compartilhar com vocês o básico desse plugin. Neste tutorial, abordaremos os filtros, ações, gerenciamento de colunas de usuários do WordPress e mais algumas coisas interessantes.
Etapa 1: criar o plug-in
Mais uma vez, aqui é muito complicado, tudo o que você precisa fazer é criar uma nova pasta com “wp-content/plugins” chamada “ban-users”. Nesta pasta, crie um novo arquivo chamado “ban-users.php”, abra-o e cole este código:
<?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
*/
Etapa 2: adicionar uma caixa de seleção na página de perfil dos usuários
A primeira coisa que precisamos fazer é adicionar uma caixa de seleção em cada página de edição de perfil de usuário. Quando você marcar esta caixa de seleção, ela armazenará uma meta-opção de usuário que indicará que o usuário não tem mais permissão para fazer login no seu site.
Aqui está o código:
/**
* 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’ );
Este código está simplesmente criando uma chamada para uma função que temos que criar agora. Esta função adicionará uma caixa de seleção à página de perfil do usuário.
/**
* 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>’;
}
Agora precisamos ter a função que salvará no banco de dados o valor do checkbox:
/**
* 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 );
}
}
Como você pode ver esta nova função usa duas outras funções: rc_ban_users() e rc_unban_users(). Seus nomes são bastante explícitos, o primeiro irá armazenar no banco de dados o fato de um usuário ser banido, o segundo irá desbloquear usuários.
Etapa 3: banir usuários
Agora é hora de criar a função rc_ban_users(). Nesta função precisamos verificar se um valor já está armazenado, caso contrário precisamos armazenar o valor. Essa é a razão pela qual eu chamo uma função que descreverei mais tarde: 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 );
}
}
Etapa 4: desbanir usuários
A função a seguir é o oposto da que acabamos de criar: temos que dar a possibilidade de “desbanir” usuários:
/**
* 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 );
}
}
Etapa 5: o usuário é banido?
Vimos em rc_ban_users() e rc_unban_users() que usamos uma função chamada rc_is_user_banned() para verificar se um usuário está banido ou não. Vamos criar:
/**
* 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 );
}
Basicamente, esta função simplesmente retorna o valor da opção salva em rc_ban_users().
Neste momento, temos uma nova caixa de seleção na página de edição do usuário que deve ser assim:
O último passo é conectar uma função ao formulário de login para evitar que usuários banidos façam login.
Etapa 5: evitar usuários banidos para fazer login
Para isso, precisamos usar um filtro padrão do WordPress chamado “wp_authenticate_user”. Para este filtro vamos ligar uma função chamada “rc_authenticate_user()”. Esta função usará a classe 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;
}
Agora, só precisamos adicionar o filtro:
add_filter( ‘wp_authenticate_user’, ‘rc_authenticate_user’, 1 );
Criamos um plugin que adiciona uma caixa de seleção à página de edição do perfil do usuário. Usamos uma segunda função para armazenar o valor na caixa de seleção e criamos uma função para banir um usuário do WordPress e outra para desbloquear um usuário. Também criamos uma pequena função para verificar se um usuário está banido ou não. E finalmente conectamos uma função ao filtro “wp_authenticate_user” usando a classe padrão WP_Error do WordPress.