¿Te has encontrado con usuarios problemáticos en tu sitio web que necesitas gestionar de manera más estricta? Este tutorial te ayudará a implementar un sistema de bloqueo de usuarios en WordPress que no solo evita que los usuarios bloqueados inicien sesión, sino que también los expulsa si ya están conectados.
Además, este sistema añade herramientas útiles en el panel de administración para facilitar la gestión de bloqueos: podrás ver el estado de bloqueo de los usuarios directamente desde la lista, saber cuántas veces han sido bloqueados e incluso actuar rápidamente con un solo clic para bloquear o desbloquear. Todo esto, manteniendo la flexibilidad y seguridad de tu sitio web.
A continuación, exploraremos cómo funciona este código, qué hace cada parte y cómo puedes adaptarlo a las necesidades de tu sitio.

¿Cómo funciona el código?
Este sistema de bloqueo consta de varias partes que trabajan en conjunto para garantizar que los usuarios bloqueados no puedan acceder a tu sitio y facilitar la administración desde el panel de WordPress. Vamos a ver cada parte en detalle:
1. Añadiendo la columna ‘Estado de Bloqueo’ al administrador de usuarios
Para empezar, este código personaliza la lista de usuarios en el administrador añadiendo una columna adicional llamada «Estado de Bloqueo». Esta columna mostrará información como:
- Si el usuario está bloqueado o activo.
- Si está bloqueado, la fecha de inicio del bloqueo.
- Cuántas veces ha sido bloqueado.
Esto se logra con las funciones:
add_block_user_column: Añade la nueva columna.fill_block_user_column: Completa la columna con datos dinámicos para cada usuario.
2. Bloqueo total: Impidiendo que los usuarios bloqueados inicien sesión
¿De qué sirve bloquear a un usuario si aún puede iniciar sesión? Aquí entra en juego la función:
prevent_blocked_user_login: Esta función revisa, al intentar iniciar sesión, si el usuario está marcado como bloqueado en los metadatos. Si es así, muestra un error y evita que acceda al sitio.
Esto es crucial para proteger tu sitio de accesos no deseados.

3. Desconexión inmediata para usuarios bloqueados
¿Qué pasa si un usuario es bloqueado mientras ya está conectado? Este código tiene una solución inteligente:
kick_out_blocked_users: Esta función detecta si un usuario bloqueado está conectado y lo expulsa inmediatamente. Además, redirige al usuario bloqueado a la página de inicio.
Esto asegura que no haya lagunas en tu sistema de seguridad.
4. Gestión rápida: Enlaces para bloquear o desbloquear usuarios
Desde la lista de usuarios en el panel de administración, puedes bloquear o desbloquear a un usuario con un solo clic. Esto es posible gracias a:
add_block_user_action_link: Agrega enlaces de acción rápidos (como «Bloquear» o «Desbloquear») debajo del nombre de cada usuario.process_user_block_unblock_links: Procesa la acción seleccionada (bloquear o desbloquear) y actualiza los datos del usuario en consecuencia.
También se asegura de que no puedas bloquear accidentalmente a administradores, protegiendo el acceso de los roles más críticos de tu sitio.
5. Registro detallado: Información sobre bloqueos
Cada vez que bloqueas a un usuario, el sistema registra:
- La fecha del bloqueo.
- La cantidad de veces que ese usuario ha sido bloqueado.
Esto te permite mantener un historial claro y completo sobre la actividad de cada usuario.
¿Por qué implementar esto?
Este sistema es perfecto para sitios que necesitan un control adicional sobre sus usuarios, como:
- Foros: Para gestionar usuarios conflictivos.
- Tiendas en línea: Para manejar cuentas fraudulentas.
- Comunidades exclusivas: Donde el acceso restringido es fundamental.
- Memberships Sites: Donde el usuario no ha pagado esa mensualidad aún.
El siguiente código tienes que agregarlo en el functions.php de tu tema hijo o utilizar un plugin como CODE SNIPPETS.
// Agregar una nueva columna a la tabla de usuarios en el administrador
add_filter('manage_users_columns', 'add_block_user_column');
function add_block_user_column($columns) {
$columns['block_user'] = 'Estado de Bloqueo';
return $columns;
}
// Mostrar el estado del bloqueo en la columna
add_action('manage_users_custom_column', 'fill_block_user_column', 10, 3);
function fill_block_user_column($value, $column_name, $user_id) {
if ('block_user' === $column_name) {
$is_blocked = get_user_meta($user_id, 'is_blocked', true);
$block_count = get_user_meta($user_id, 'block_count', true) ?: 0;
$block_date = get_user_meta($user_id, 'block_date', true);
// Formatear la fecha en día/mes/año
$formatted_date = $block_date ? date_i18n('d/m/Y', strtotime($block_date)) : '';
if ($is_blocked) {
return "<strong style='color: red;'>Bloqueado</strong><br>
Fecha: $formatted_date<br>
Veces bloqueado: $block_count";
} else {
$block_info = $block_count > 0 ? "<br><span style='color: #666;'>Veces bloqueado: $block_count</span>" : '';
return "<strong style='color: green;'>Activo</strong>$block_info";
}
}
return $value;
}
// Impedir que los usuarios bloqueados inicien sesión
add_action('wp_authenticate_user', 'prevent_blocked_user_login', 10, 2);
function prevent_blocked_user_login($user) {
if (get_user_meta($user->ID, 'is_blocked', true)) {
return new WP_Error('blocked_user', __('Tu cuenta está bloqueada. Contacta al administrador.'));
}
return $user;
}
// Impedir que los usuarios bloqueados naveguen mientras están conectados
add_action('init', 'kick_out_blocked_users');
function kick_out_blocked_users() {
if (is_user_logged_in()) {
$user_id = get_current_user_id();
if (get_user_meta($user_id, 'is_blocked', true)) {
wp_logout(); // Desconecta al usuario inmediatamente
wp_redirect(home_url()); // Redirige al inicio
exit;
}
}
}
// Modificar los enlaces debajo del nombre del usuario
add_filter('user_row_actions', 'add_block_user_action_link', 10, 2);
function add_block_user_action_link($actions, $user) {
// Solo mostrar para usuarios no administradores
if (!current_user_can('manage_options') || in_array('administrator', $user->roles)) {
return $actions;
}
$is_blocked = get_user_meta($user->ID, 'is_blocked', true);
$block_count = get_user_meta($user->ID, 'block_count', true) ?: 0;
// Agregar enlace de Bloquear/Desbloquear según el estado del usuario
if ($is_blocked) {
$actions['unblock_user'] = '<a href="' . esc_url(admin_url('users.php?action=unblock_user&user_id=' . $user->ID)) . '">Desbloquear</a>';
} else {
$actions['block_user'] = '<a href="' . esc_url(admin_url('users.php?action=block_user&user_id=' . $user->ID)) . '">Bloquear</a>';
}
return $actions;
}
// Procesar las acciones de bloquear/desbloquear desde los enlaces
add_action('admin_init', 'process_user_block_unblock_links');
function process_user_block_unblock_links() {
if (!current_user_can('manage_options') || empty($_GET['action']) || empty($_GET['user_id'])) {
return;
}
$action = sanitize_text_field($_GET['action']);
$user_id = intval($_GET['user_id']);
// Evitar bloquear/desbloquear administradores
$user = get_userdata($user_id);
if (in_array('administrator', $user->roles)) {
wp_die(__('No puedes bloquear a un administrador.', 'text-domain'));
}
if ($action === 'block_user') {
update_user_meta($user_id, 'is_blocked', true);
update_user_meta($user_id, 'block_date', current_time('mysql'));
$block_count = get_user_meta($user_id, 'block_count', true) ?: 0;
update_user_meta($user_id, 'block_count', $block_count + 1);
// Desconectar al usuario si está bloqueado
if (function_exists('wp_destroy_user_sessions')) {
wp_destroy_user_sessions($user_id);
}
} elseif ($action === 'unblock_user') {
delete_user_meta($user_id, 'is_blocked');
delete_user_meta($user_id, 'block_date');
}
// Redirigir de vuelta a la lista de usuarios
wp_redirect(admin_url('users.php'));
exit;
}
Lenguaje del código: PHP (php)
En conclusión, implementar un sistema de bloqueo de usuarios en WordPress no solo mejora la seguridad de tu sitio, sino que también te otorga un mayor control sobre quién puede acceder y navegar en él. Con las funciones descritas, podrás gestionar de manera eficiente a los usuarios desde el panel de administración, registrar información relevante y actuar rápidamente ante cualquier problema.
Nos vemos en el siguiente tutorial. Un saludo.




Deja tus opiniones o dudas en los comentarios.