✅¿Usuarios conflictivos? Aprende a bloquearlos en WordPress como un profesional

¿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.

bloquear usuarios wordpress

¿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.

bloquear usuarios wordpress sin plugins

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.

5/5 - (4 votos)
Compartir Artículo

Un comentario

  1. Fran Salas Master WP 2 años atrás

    Deja tus opiniones o dudas en los comentarios.

¿Tienes una duda o sugerencia sobre este artículo?

Puedes dejar un comentario de forma anónima, sin necesidad de registrarte ni proporcionar ningún dato personal. Tu mensaje se publicará como “Usuario Anónimo No Premium”, un perfil que agrupa a todos los visitantes no registrados.

Importante: para evitar el spam automático, todos los comentarios anónimos deben comenzar con el símbolo #. Ejemplo: # Tengo una duda sobre los shortcodes personalizados...

Este espacio está destinado exclusivamente a preguntas concretas, dudas o sugerencias relacionadas con el contenido del artículo. Por respeto a los demás lectores, no se publicarán temas sin relación.

Privacidad y normas:
  • No tienes que agregar tu nombre, correo ni ningún otro dato identificativo.
  • No se permiten enlaces en comentarios anónimos.
  • No se permiten símbolos especiales como < o > (menor y mayor que), ya que se consideran intentos de insertar código y serán bloqueados.
  • Todos los comentarios anónimos pasan por revisión antes de ser publicados y solo se aprobarán si aportan valor al contenido del artículo.
¿Quieres comentar con tu nombre y que tu mensaje se publique al instante? Inicia sesión o regístrate.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

0%