Pulsa ESC para cerrar

Curso WordpressCurso Wordpress

Cerrar la sesión de los usuarios inactivos en WordPress después de X horas

Cuando inicias sesión en WordPress, la sesión dura 2 días, o 14 días si marcaste «Recuérdame». Da igual si estás trabajando o si dejaste la pestaña abierta en el computador de la oficina y te fuiste a casa: mientras la cookie sea válida, cualquiera que se siente frente a ese equipo tiene tu acceso.

Para un suscriptor no es grave. Para un administrador o una persona que gestiona pedidos, sí.

Dos medidas distintas

  1. Duración máxima de la sesión: cuánto tiempo vale la cookie, haya o no actividad.
  2. Cierre por inactividad: si pasan X horas sin hacer nada, la sesión se cierra, aunque la cookie siga vigente.

Lo ideal es combinar las dos.

Medida 1: sesiones más cortas para quien tiene más permisos

El filtro auth_cookie_expiration define la duración de la cookie al iniciar sesión. Con este código, quien puede editar contenido tiene sesiones de 12 horas, marque o no «Recuérdame», y el resto conserva lo habitual:

<?php
add_filter( 'auth_cookie_expiration', function ( $duracion, $user_id, $recordar ) {
	if ( user_can( $user_id, 'edit_posts' ) ) {
		return 12 * HOUR_IN_SECONDS;
	}
	return $duracion;
}, 10, 3 );

El cambio se aplica a las sesiones que se inicien después de agregar el código.

Medida 2: cierre por inactividad

WordPress no trae esta función, pero se puede construir. El detalle importante: el Heartbeat (las consultas automáticas que hace el escritorio cada cierto tiempo) no debe contar como actividad. Si contara, una pestaña olvidada mantendría la sesión viva para siempre.

Guárdalo como wp-content/mu-plugins/cwp-inactividad.php:

<?php
/**
 * Plugin Name: Cierre por inactividad (Curso WordPress)
 */

const CWP_INACTIVIDAD_MAX = 2 * HOUR_IN_SECONDS;   // Tiempo sin actividad permitido.
const CWP_INACTIVIDAD_CAP = 'edit_posts';          // A quién se aplica.

add_action( 'init', function () {
	if ( ! is_user_logged_in() || wp_doing_cron() || ! current_user_can( CWP_INACTIVIDAD_CAP ) ) {
		return;
	}
	$id       = get_current_user_id();
	$ultima   = (int) get_user_meta( $id, 'cwp_ultima_actividad', true );
	$ahora    = time();
	$latido   = wp_doing_ajax() && isset( $_POST['action'] ) && 'heartbeat' === $_POST['action'];

	if ( $ultima && ( $ahora - $ultima ) > CWP_INACTIVIDAD_MAX ) {
		delete_user_meta( $id, 'cwp_ultima_actividad' );
		wp_destroy_current_session();
		wp_clear_auth_cookie();
		wp_set_current_user( 0 );
		if ( ! wp_doing_ajax() ) {
			wp_safe_redirect( wp_login_url( home_url( add_query_arg( array() ) ) ) );
			exit;
		}
		return;
	}

	// Registrar actividad real (no el Heartbeat), como máximo cada 5 minutos.
	if ( ! $latido && ( $ahora - $ultima ) > 5 * MINUTE_IN_SECONDS ) {
		update_user_meta( $id, 'cwp_ultima_actividad', $ahora );
	}
} );

// Al iniciar sesión, empezar a contar desde cero.
add_action( 'wp_login', function ( $login, $usuario ) {
	update_user_meta( $usuario->ID, 'cwp_ultima_actividad', time() );
}, 10, 2 );

Cómo se comporta:

  • Cada vez que la persona carga una página o guarda algo, se anota la hora (como máximo una vez cada 5 minutos, para no escribir en la base de datos en cada clic).
  • Si vuelve después de más de 2 horas, la sesión se cierra y aparece la pantalla de acceso.
  • Si la pestaña quedó abierta, el Heartbeat detecta que la sesión ya no es válida y WordPress muestra su ventana de «Tu sesión ha caducado» para volver a entrar sin perder lo que estaba en pantalla.

Si alguien escribe una entrada larga durante más de 2 horas sin guardar, al guardar le pedirá iniciar sesión otra vez. El editor de bloques conserva el contenido en el navegador y la ventana de acceso permite seguir, pero avisa a tu equipo y ajusta CWP_INACTIVIDAD_MAX a su forma de trabajar.

Ver y cerrar sesiones abiertas

En Usuarios → Perfil, al final, el botón Cerrar el resto de sesiones cierra todas las sesiones de esa cuenta menos la actual. Desde WP-CLI puedes revisarlas y cerrarlas para cualquier usuario:

wp user session list admin
wp user session destroy admin --all

¿Cuánto tiempo de inactividad te parece razonable para tu equipo? Compártelo en el foro y comparamos configuraciones.