
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
- Duración máxima de la sesión: cuánto tiempo vale la cookie, haya o no actividad.
- 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.





