¿Redirigir al usuario a la URL original después del inicio de sesión?

30 abr 2011, 06:35:04
Vistas: 65.8K
Votos: 18

Tengo una función que redirige a los usuarios a la página de inicio de sesión (inicio) si intentan acceder a cualquier otra página sin estar conectados, así es como funciona:

function restrict_access_if_logged_out(){
    if (!is_user_logged_in() && !is_home()){
        wp_redirect( get_option('home') );
    }
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );

Es realmente simple y funciona bien, el problema es que necesito redirigirlos a la URL a la que intentaban ir después de que inicien sesión exitosamente, exactamente como funciona el backend de WordPress.

¿Hay alguna manera de hacer esto? ¡Gracias de antemano!

0
Todas las respuestas a la pregunta 7
2
16

Puedes hacerlo fácilmente. Solo necesitas especificar un parámetro de redirección. Si estás usando un enlace de inicio de sesión en la página de inicio para ir a la página de acceso, entonces la solución de @sisir es correcta.

<?php echo wp_login_url( $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"] ); ?>

Si estás usando un formulario personalizado en la página principal, entonces dentro del <form>, asegúrate de incluir un campo oculto con la URL de redirección

<input type="hidden" name="redirect_to" value="<?php echo $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]; ?>" />

Y si estás usando wp_login_form() para generar el formulario, entonces completa un parámetro - http://codex.wordpress.org/Function_Reference/wp_login_form

<?php
$args = array(
        'echo' => true,
        'redirect' => site_url( $_SERVER['REQUEST_URI'] ), 
        'form_id' => 'loginform',
        'label_username' => __( 'Nombre de usuario' ),
        'label_password' => __( 'Contraseña' ),
        'label_remember' => __( 'Recuérdame' ),
        'label_log_in' => __( 'Iniciar sesión' ),
        'id_username' => 'user_login',
        'id_password' => 'user_pass',
        'id_remember' => 'rememberme',
        'id_submit' => 'wp-submit',
        'remember' => true,
        'value_username' => NULL,
        'value_remember' => false );

wp_login_form( $args );
?>

Cambia otros parámetros según lo que tengas o necesites.

30 abr 2011 13:43:56
Comentarios

Estoy usando un formulario personalizado y estoy utilizando la solución de campo oculto que proporcionaste, pero en mi caso me redirige a una URL como esta 'localhost/wordpress/localhost/wordpress/blog/alguien'. ¿Alguna ayuda?

rafi rafi
6 feb 2014 08:15:56

Lo he solucionado, estaba usando doble barra. Mi solución es así <?php echo '//' . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]; ?>

rafi rafi
6 feb 2014 08:19:15
2

Intenta pasar the_permalink() como argumento $redirect:

function restrict_access_if_logged_out(){
    if (!is_user_logged_in() && !is_home()){
        wp_redirect( the_permalink() );
    }
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );

EDITADO:

Disculpa, originalmente malinterpreté tu pregunta. Prueba esto:

function restrict_access_if_logged_out(){
    if (!is_user_logged_in() && !is_home()){
        $redirect = home_url() . '/wp-login.php?redirect_to=' . urlencode( $_SERVER['REQUEST_URI'] );
        wp_redirect( $redirect );
        exit;
    }
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );

Nota adicional: el uso correcto de wp_redirect() generalmente requiere agregar exit;, lo cual he añadido en mi segundo ejemplo.

30 abr 2011 06:42:23
Comentarios

Eso no tiene ningún sentido, la redirección debe ir a la página de inicio, eso funciona bien. Necesito alguna forma de capturar la URL original y redirigir al usuario allí una vez que inicie sesión.

Javier Villanueva Javier Villanueva
30 abr 2011 08:12:44

Perdón, entendí mal tu pregunta originalmente. He añadido una edición que espero aborde tu caso de uso.

Chip Bennett Chip Bennett
30 abr 2011 15:34:20
3

Gracias a todos, terminé usando un poco de lo que cada uno recomendó, así que al final mi código quedó así:

function restrict_access_if_logged_out(){
    if (!is_user_logged_in() && !is_home()){
        wp_redirect( get_option('home') . '?redirect_to=' . esc_url($_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]) );
    }
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );

Y en mi formulario de inicio de sesión (estoy codificando manualmente mi formulario de inicio de sesión en mi aplicación, gracias @Ashfame por hacerme saber sobre wp_login_form, no tenía idea de que existía) agregué esto cuando las credenciales del usuario son correctas y están listos para iniciar sesión:

if (isset($_REQUEST['redirect_to'])){
    wp_redirect($_REQUEST['redirect_to']);
    // wp_redirect() no termina la ejecución automáticamente, por lo que casi siempre debe ir seguido de un exit;
    exit;

} else {
    wp_redirect(get_bloginfo('url') . '/groups/');
    exit;
}

¡Muchas gracias por su ayuda, voté positivamente a todos!

30 abr 2011 19:41:27
Comentarios

Hola Javier, ¿en qué archivo agregaste estas funciones? Gracias.

Tyler Durden Tyler Durden
24 ago 2012 13:09:27

En functions.php

Javier Villanueva Javier Villanueva
25 ago 2012 23:40:09

Deberías llamar a exit() o die() después de wp_redirect(). De lo contrario, es posible que el código después de wp_redirect() se ejecute, lo que puede provocar errores y vulnerabilidades de seguridad.

Ian Dunn Ian Dunn
6 nov 2012 19:21:38
0

Este es mi código que utilizo para dirigir a las personas a la página de inicio de sesión de WordPress. Luego, cuando inician sesión, regresan al lugar donde estaban. Pero no es la página de inicio, sino la página de inicio de sesión de WordPress donde configuré un inicio de sesión personalizado.

<?php echo wp_login_url( $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]) ?>

Quizás quieras investigar con esto. Normalmente, obtendrás la URL actual de un usuario con $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]

30 abr 2011 11:43:01
3

Sé que esto llega muy tarde, pero hice una publicación sobre exactamente cómo hacer esto por si alguna persona en el futuro encuentra esto y lo necesita:

http://www.ryanprejean.com/force-login-with-redirect-and-exceptions/

17 mar 2016 23:02:27
Comentarios

Aunque este enlace puede responder a la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace como referencia. Las respuestas que solo contienen enlaces pueden volverse inválidas si la página enlazada cambia. Consulta [answer].

Gabriel Gabriel
17 mar 2016 23:37:09

El enlace está roto (abril 2020).

Philip Jones Philip Jones
22 abr 2020 16:01:55

Pude acceder al enlace roto con la máquina Wayback, por si alguien más necesita la información.

jsmod jsmod
26 oct 2020 14:13:38
0

El login_redirect filtro hook es una solución más completa y efectiva aquí. De esta manera, puedes ofrecer diferentes rutas de redirección para distintos niveles de usuarios, o mantener la URL de redirección en caso de un error al iniciar sesión (por ejemplo, contraseña incorrecta).

function login_redirect( $redirect_to, $request, $user ){
  if(isset($_REQUEST['redirect_to'])){
    return $_REQUEST['redirect_to'];
  }
  return admin_url();
}
add_filter( 'login_redirect', 'login_redirect', 10, 3 );

function restrict_access_if_logged_out(){
  if (!is_user_logged_in() && !is_home()){
    $redirect = home_url() . '?redirect_to=' . esc_url($_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]);
    wp_redirect( $redirect );
  }
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );
12 ago 2014 18:24:16
0

¡Ninguna de tus respuestas funcionó, pero al agregar un pequeño detalle, ¡sí funcionó! Aquí mi código:

function login_redirect( $redirect_to, $request, $user ){
  if(isset($_REQUEST['redirect_to'])){
    return $_REQUEST['redirect_to'];
  }
  return admin_url();
}
add_filter( 'login_redirect', 'login_redirect', 10, 3 );

function restrict_access_if_logged_out(){
  if (!is_user_logged_in() && !is_home()){
    $redirect = home_url() . '/wp-login.php?redirect_to=' . esc_url($_SERVER["HTTP_HOST"] . urlencode($_SERVER["REQUEST_URI"]));
    wp_redirect( $redirect );
    exit;
  }
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );

Solo agregué /wp-login.php en comparación con la respuesta de @Matt, pero para mí fue la clave. ¡Espero que ayude! :)

**EDITADO:

Detecté un ERROR cuando FORZAS a WordPress a navegar en HTTPS. Este método no funciona porque la redirección es en HTTP. Para solucionarlo, modifiqué la función. Este es el resultado:

function restrict_access_if_logged_out(){
  global $wp;
  $protocol='http';
  if (isset($_SERVER['HTTPS']))
    if (strtoupper($_SERVER['HTTPS'])=='ON')
      $protocol='https';
  if (!is_user_logged_in() && !is_home() && ($wp->query_vars['pagename'] != 'downloads') ){
    $redirect = home_url() . "/wp-login.php?redirect_to= $protocol://" . $_SERVER["HTTP_HOST"] . urlencode($_SERVER["REQUEST_URI"]);
    wp_redirect( $redirect );
    exit;
  }
}
add_action( 'wp', 'restrict_access_if_logged_out', 3 );

Verifico el protocolo y luego eliminé 'esc_url' y agregué el protocolo correcto: $protocol://. También cambié las "".

Me basé en esta página.

22 ago 2014 15:11:08