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

16

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 iniciar sesión, 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 );

Realmente simple y funciona bien, el problema es que necesito redirigirlos a la url a la que intentaban ir después de iniciar sesión con éxito, exactamente como funciona el backend de WordPress.

¿Hay alguna forma de hacer esto? ¡Gracias por adelantado!

Javier Villanueva
fuente

Respuestas:

16

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

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

Si está utilizando un formulario personalizado en la portada, luego dentro del <form>, asegúrese de completar un campo oculto con la URL para redirigir

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

Y si está utilizando wp_login_form()para generar el formulario, complete 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' => __( 'Username' ),
        'label_password' => __( 'Password' ),
        'label_remember' => __( 'Remember Me' ),
        'label_log_in' => __( 'Log In' ),
        '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 );
?>

Cambie otros parámetros según lo que tenga o necesite.

Ashfame
fuente
Estoy usando un formulario personalizado y estoy usando la solución de campo oculta que me proporcionó, pero en mi caso me redirigen a una URL como esta 'localhost / wordpress / localhost / wordpress / blog / someone'. ¿alguna ayuda?
rafi
Tengo esto, estoy usando doble barra. entonces mi solución es así <? php echo '//'. $ _SERVER ["HTTP_HOST"]. $ _SERVER ["REQUEST_URI"]; ?>
rafi
6

Intenta pasar the_permalink()como $redirectargumento:

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 );

EDITAR:

Lo sentimos, entendí mal tu pregunta originalmente. 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 );

Tenga en cuenta también: el uso adecuado de wp_redirect()generalmente requiere agregar exit;, que he agregado a mi segundo ejemplo.

Chip Bennett
fuente
Eso no tiene ningún sentido, la redirección debe ir a casa, está funcionando bien. Necesito alguna forma de captar la URL original y redirigir al usuario allí una vez que inicie sesión.
Javier Villanueva
Lo sentimos, entendí mal tu pregunta originalmente. Agregué una edición que espero aborde su caso de uso.
Chip Bennett
4

Gracias a todos, usé un poco de lo que todos recomendaron, así que al final mi código se ve 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 mi formulario de inicio de sesión en mi aplicación, gracias @Ashfame por informarme sobre wp_login_form, no tenía idea de que existía). Agregué esto cuando las credenciales de usuario están bien y están listas para iniciar sesión:

if (isset($_REQUEST['redirect_to'])){
    wp_redirect($_REQUEST['redirect_to']);
    // wp_redirect() does not exit automatically, and should almost always be followed by a call to exit;
    exit;

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

Muchas gracias por su ayuda, ¡he votado a todos!

Javier Villanueva
fuente
Hola Javier, ¿en qué archivo agregaste estas funciones? Gracias.
Tyler Durden
Enfunctions.php
Javier Villanueva
44
Deberías llamar exit()o die()después wp_redirect(). De lo contrario, es posible que el código posterior wp_redirect()se ejecute, lo que puede generar errores y vulnerabilidades de seguridad.
Ian Dunn
2

Este es mi código que uso para dirigir a la página de inicio de sesión de wp. Luego, cuando iniciaron sesión, regresaron a donde estaban. Pero no es la página de inicio, sino la página de inicio de sesión de WordPress donde configuro el inicio de sesión personalizado.

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

Es posible que desee investigar con. Normalmente obtendrá la URL actual de un usuario por$_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]

Sisir
fuente
0

El login_redirectgancho del filtro es una solución más completa y efectiva aquí. De esta manera, puede ofrecer diferentes rutas de redireccionamiento para diferentes niveles de usuarios, o mantener la URL de redireccionamiento en caso de error al iniciar sesión (es decir, 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 );
Mate
fuente
0

No ha funcionado ninguna de sus respuestas, pero solo agregó una pequeña cosa, ¡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.phpen comparación con la respuesta de @ Matt, pero para mí ha sido la clave. ¡Espero que ayude! :)

**EDITAR:

Detecté un ERROR cuando estás forzando wordpress para navegar en HTTPS. Este método no funciona porque la redirección está en HTTP. Para solucionar el problema, cambié 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 );

Puedo comprobar el protocolo y luego Suprimí ' esc_url' y añadió el protocolo correcto: $protocol://. También cambié el "".

Estoy basado en esta página .

Neil
fuente
0

Sé que esto es muy tarde, pero hice una publicación sobre cómo hacerlo exactamente si alguna persona futura lo encuentra y lo necesita:

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

usuario90810
fuente
Si bien este enlace puede responder la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace como referencia. Las respuestas de solo enlace pueden volverse inválidas si la página vinculada cambia. Vea cómo responder .
Gabriel