Redireccionar usuarios si están logueados
Este script funciona perfectamente y redirige a los usuarios no logueados a la página de login si intentan acceder a la página de mi-cuenta:
// Redirigir página de cuenta a login si el usuario no está logueado
add_action( 'template_redirect', function() {
if ( is_user_logged_in() || ! is_page() ) return;
$logged_in_restricted = array( 5156, 000 ); // todas tus páginas restringidas si el usuario no está logueado
if ( in_array( get_queried_object_id(), $logged_out_restricted ) ) {
wp_redirect( site_url( '/login' ) ); // página a la que se redirige si se cumple la restricción
exit();
}
});
¿Cómo puedo utilizar la misma lógica del script pero dirigida a usuarios logueados como un script adicional? Por ejemplo, ahora quiero redirigir a usuarios logueados a la página "mi-cuenta" si intentan ir a las páginas de login/registro. Aquí un ejemplo:
// Redirigir páginas de login y registro a cuenta si el usuario está logueado
add_action( 'template_redirect', function() {
if ( is_user_logged_out() || ! is_page() ) return;
$logged_in_restricted = array( 3156, 4532 ); // todas tus páginas restringidas si el usuario está logueado
if ( in_array( get_queried_object_id(), $logged_in_restricted ) ) {
wp_redirect( site_url( '/my-account' ) ); // página a la que se redirige si se cumple la restricción
exit();
}
});
Entiendo que is_user_logged_out
no existe. ¿Qué puedo usar para lograr esto?

Método 1
Puedes usar el filtro login_redirect
para añadir una URL de redirección al iniciar sesión.
El filtro pasa 3 argumentos
// referencia a /wp-login.php
/**
* Filtra la URL de redirección al iniciar sesión.
*
* @since 3.0.0
*
* @param string $redirect_to La URL de destino de redirección.
* @param string $requested_redirect_to La URL de redirección solicitada pasada como parámetro.
* @param WP_User|WP_Error $user Objeto WP_User si el inicio de sesión fue exitoso, objeto WP_Error en caso contrario.
*/
El siguiente ejemplo solo pasa la URL, también puedes pasar el argumento $user y redirigir según diferentes usuarios.
add_filter( 'login_redirect', 'ws365094_logout_redirect_to', 10, 3 );
function ws365094_logout_redirect_to( $redirect_to_url, $requested_redirect_to, $user ) {
// cualquier lógica adicional
return site_url( '/mi-cuenta' ); // solo pasa esta URL, después del inicio de sesión, será redirigido por la rutina original de WordPress
}
Método 2
Si tienes un formulario de inicio de sesión personalizado, puedes pasar la variable "redirect_to" porque wp-login.php verificará si existe alguna. Si rediriges a todos a la misma URL, este método es más simple que el método 1.
<input type="hidden" name="redirect_to" value="url_destino" />
Para tu método original de cierre de sesión, también puedes usar el filtro logout_redirect
para añadir una URL de redirección al cerrar sesión en lugar de la acción template_redirect
. template_redirect
es bastante universal pero tiene más casos de uso en redirecciones a plantillas específicas (control de plantillas). Solo una nota adicional como referencia.
Comparación de secuencia entre template_redirect
y login_redirect
Según la secuencia de carga. Por defecto, después de iniciar sesión, WordPress redirige al usuario a una página específica para que la cookie funcione, lo cual he explicado aquí antes.
Inicio de sesión -> Redirección -> Redirección de plantilla (canónica) que normalmente se hace mediante redirect_canonical() si no se encuentra el slug, va a 404, si se usa /?p=111, verifica si se usa el enlace permanente, si es así, redirige a la URL estructurada del enlace permanente, etc.
Si usas template_redirect
, significa que la página se está manejando en template-loader.php
. Se convierte en:
Inicio de sesión -> Redirección -> Redirección de plantilla (canónica) -> Redirección de plantilla personalizada
Porque sigue a do_action( 'template_redirect' ) en el cargador de plantillas, que se cargará múltiples veces en este caso. Una forma de optimizar el script es usar una prioridad más alta para el hook personalizado template_include
para que verifique y redirija antes, funcionando de manera similar a Login Redirect.
Dado que llegar a template_redirect
es un poco tarde en términos de tiempo de carga. Por lo tanto, no es el lugar ideal para hacer una verificación de inicio de sesión del usuario y redirigir a algún lugar que no esté relacionado con plantillas.
Entonces, a menos que sea necesario, como para hacer reescrituras, estructuras de URL personalizadas o preparación de plantillas personalizadas. No se recomienda usarlo en un momento posterior. Además, si la redirección no se maneja hábilmente, también podría afectar el ranking SEO. Eso se basa en la secuencia de carga real, el punto de vista de optimización SEO y la experiencia personal.

Estaba muy contento con la lógica anterior y solo necesitaba un pequeño cambio. Agregar un !
antes de is_user_logged_in()
resolvió completamente mi problema y me permitió invertir la lógica.
/**********************************INICIO*************************************
********** Redirigir página de cuenta a login si el usuario está logueado *********
****************************************************************************/
add_action( 'template_redirect', function() {
if ( ! is_user_logged_in() || ! is_page() ) return;
$restricted = array( 4062, 4066 ); // todas tus páginas restringidas
if ( in_array( get_queried_object_id(), $restricted ) ) {
wp_redirect( site_url( '/cuenta' ) );
exit();
}
});
