Redireccionar a la página de referencia después de iniciar sesión

27 nov 2014, 14:30:05
Vistas: 49.4K
Votos: 7

No estoy usando ningún plugin de inicio de sesión personalizado ni código específico. Algunas de mis páginas tienen este fragmento de código al principio.

<?php
    if(!is_user_logged_in())
        wp_redirect('/login/');
?>

Esto no permite que los usuarios vean la página cuando no han iniciado sesión. Tengo estas páginas con este fragmento de código:

/wp-content/my-theme/my-account/
/wp-content/my-theme/my-account/world.php
/wp-content/my-theme/my-account/subscription.php
/wp-content/my-theme/my-dashboard.php
/wp-content/my-theme/my-files.php

Ahora, cuando un usuario va a cualquiera de las páginas anteriores sin iniciar sesión, se redirige a la página de login, y cuando el usuario inicia sesión, lo lleva a la página my-account/.

Quiero cambiar el escenario actual para hacer que el usuario se redirija a la página de referencia, de donde vino. Intenté las siguientes cosas, que nunca funcionaron.

Usando HTTP_REFERRER

En el formulario de login/, coloqué este fragmento de código:

<input type="hidden" name="redirect" value="<?php echo $_SERVER['HTTP_REFERER']; ?>" />

Modificando functions.php

En el archivo functions.php, coloqué este fragmento de código:

if ( (isset($_GET['action']) && $_GET['action'] != 'logout') || (isset($_POST['login_location']) && !empty($_POST['login_location'])) ) {
        add_filter('login_redirect', 'my_login_redirect', 10, 3);
        function my_login_redirect() {
                $location = $_SERVER['HTTP_REFERER'];
                wp_safe_redirect($location);
                exit();
        }
}

Referencias:


También he probado estos y fallaron:

Nada funcionó. Estoy dispuesto a proporcionar más detalles si es necesario. Gracias de antemano. :)


Actualización

He modificado el código de esta manera:

<?php
    if(!is_user_logged_in())
        wp_redirect('/login/?redirect_to=' . $_SERVER["REQUEST_URI"]);
?>

Esto muestra la página de login de esta manera:

/login.php?redirect_to=/my-account/subscription.php

Esto sería suficiente para autenticar y redirigir. ¡Pero necesito encontrar la parte donde ocurre la redirección real y quiero redirigirla usando el parámetro redirect_to!

2
Comentarios

¿Encontraste alguna solución a este problema? ¡Estoy teniendo el mismo inconveniente!

Tom Nolan Tom Nolan
7 jun 2015 19:31:56

@ThomasNolan ¡En realidad usé una variable temporal! ;)

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
8 jun 2015 07:46:53
Todas las respuestas a la pregunta 4
12
13

No estoy seguro de entender tu configuración, pero aquí hay algunas ideas:

A) Mostrar un enlace de inicio de sesión con el parámetro redirect_to configurado:

Podrías agregar lo siguiente a tus páginas de plantillas personalizadas:

if( ! is_user_logged_in() )
{
    printf( '<a href="%s">%s</a>', 
        wp_login_url( get_permalink() ),
        __( '¡Necesitas iniciar sesión para ver esta página!' )
    );
}

Esto generará un enlace de inicio de sesión, para visitantes anónimos, con la página actual en el parámetro GET redirect_to.

B) Redirigir a wp-login.php con el parámetro redirect_to configurado:

Ten en cuenta que la llamada a wp_redirect() debe ocurrir antes de que se envíen los encabezados HTTP.

Podemos llamarla dentro del hook template_redirect:

add_action( 'template_redirect', 
    function()
    {
        if( ! is_user_logged_in() 
            && is_page( array( 'member-page-1', 'member-page-2' ) ) 
        )
        {
            wp_safe_redirect( wp_login_url( get_permalink() ) ); 
            exit();
        }
    }
);

donde restringimos el acceso a páginas con los slugs member-page-1 y member-page-2.

C) El formulario de inicio de sesión nativo (en línea):

Otra opción sería incluir el formulario de inicio de sesión nativo, directamente en el contenido de la página:

add_filter( 'the_content', function( $content ) {

    if( ! is_user_logged_in() 
        && is_page( array( 'member-page-1', 'member-page-2' ) ) 
    )
        $content = wp_login_form( array( 'echo' => 0 ) );

    return $content;
}, PHP_INT_MAX );

donde restringimos el acceso a páginas con los slugs member-page-1 y member-page-2.

Nota: Tendrías que encargarte de las páginas de archivo/índice/búsqueda.

Actualización: Lo simplifiqué usando la función wp_login_url().

27 nov 2014 15:19:18
Comentarios

Ya proporcioné el redirect_to al login.php. Revisa la respuesta actualizada. Pero después de iniciar sesión, simplemente va a my-account, lo cual debe reemplazarse con redirect_to.

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
27 nov 2014 15:21:54

Ten en cuenta que debes usar wp_redirect antes de que se envíen los encabezados HTTP. Podrías considerar usar la acción template_redirect, por ejemplo.

birgire birgire
27 nov 2014 15:28:43

Vale, ¿dónde ocurre el redirect()?

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
27 nov 2014 15:30:26

La función wp_redirect() es pluggable pero también puedes acceder al filtro wp_redirect.

birgire birgire
27 nov 2014 15:33:45

No entiendo. ¿Qué significa pluggable?

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
27 nov 2014 15:34:16

Puedes sobrescribirla con tu propia función wp_redirect(), pero no lo recomiendo.

birgire birgire
27 nov 2014 15:34:49

Buena respuesta, pero no logré que funcione en una página de inicio de sesión personalizada.

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
27 nov 2014 16:26:54

Si tu archivo personalizado login.php funciona con el parámetro redirect_to, entonces creo que deberías poder simplemente reemplazar wp-login.php con login.php en el fragmento de código anterior. PD: Asumo que estás usando páginas de WordPress y no archivos PHP simples.

birgire birgire
27 nov 2014 17:37:20

El inicio de sesión personalizado simplemente no funciona. El wp-login.php original sí funciona con la redirección.

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
27 nov 2014 17:48:37

Esto no funciona, pero acepto la respuesta por tu duro trabajo. Continuaré esto en StackOverflow. ¿Puedes venir allí?

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
27 nov 2014 17:52:46

Vale, gracias, parece que encontraste una solución en Javascript que te funciona allí.

birgire birgire
27 nov 2014 18:37:04

Sí, amigo, fue mi error. ¡El código personalizado era uno de JavaScript! :)

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
27 nov 2014 19:45:29
Mostrar los 7 comentarios restantes
5

Usar get_permalink(), como se sugiere en la respuesta aceptada, solo funcionará si estás en una entrada (de cualquier tipo) pero no funcionará, por ejemplo, si estás en un archivo de categoría. Para que funcione en cualquier lugar, se necesita la URL actual, sin importar qué tipo de contenido estemos viendo.

Para obtener la URL actual en WordPress podemos obtener la solicitud actual del objeto global $wp y añadirla a la URL del sitio usando add_query_arg(). Podemos usar el resultado en el parámetro redirect_to de la función wp_login_url():

wp_login_url( site_url( add_query_arg( array(), $wp->request ) ) );

El mismo enfoque se puede usar con wp_logout_url() si es necesario:

wp_logout_url( site_url( add_query_arg( array(), $wp->request ) ) );
1 dic 2015 09:11:24
Comentarios

El proyecto murió hace un año. Bueno, ¿qué sentido tiene responder ahora? Porque, ¿acaso leíste la respuesta aceptada anterior?

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
1 dic 2015 09:13:39

Sí, leí la respuesta anterior y creo que podría dar una mejor respuesta, quizás no para ti pero para otros. Ten en cuenta que este sitio (y cualquiera de los sitios de StackExchange en general) es usado como referencia por miles de personas y pueden encontrarse respuestas desactualizadas; es por eso que dar nuevas respuestas o actualizar las antiguas es siempre bienvenido. Recuerda que la ayuda que obtienes aquí no es solo para ti.

cybmeta cybmeta
1 dic 2015 09:20:24

Ja ja... Hombre, tengo 62k en StackOverflow. Entiendo lo que quieres decir. Ese es un código personalizado que salió mal, y no estoy seguro de que ayude. ¿Lo hará? Si es así, muchas gracias.

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
1 dic 2015 09:21:23

No tengo dudas de que puede ayudar. Por ejemplo, esta otra pregunta ha sido marcada hace unos minutos como duplicada de la que estamos discutiendo.

cybmeta cybmeta
1 dic 2015 09:28:03

Ja ja... Está bien. Me rindo. ¡Tienes razón! :)

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
1 dic 2015 09:29:42
3

También puedes usar este código en tu página de inicio de sesión personalizada

if ( ! is_user_logged_in() ) { // Mostrar el formulario de inicio de sesión de WordPress:
   $args = array(
    'redirect' => esc_url($_SERVER['HTTP_REFERER']), 
    'form_id' => 'loginform-custom',
    'label_username' => __( 'Email' ),
    'label_password' => __( 'Contraseña' ),
    'label_log_in' => __( 'Iniciar Sesión' ),
    'remember' => false
);
wp_login_form($args);
echo '<p><a href="' . wp_lostpassword_url($redirect) .'">¿Olvidaste tu contraseña?</a></p>';
}

Esto redirigirá al usuario a la página de referencia después del inicio de sesión.

6 jul 2016 08:46:25
Comentarios

Esto fue publicado como una respuesta, pero no intenta responder la pregunta. Posiblemente debería ser una edición, un comentario, otra pregunta o eliminarse por completo.

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
6 jul 2016 11:13:25

Esto sí responde la pregunta. Puedes ver que el usuario es redirigido a una página de inicio de sesión personalizada <?php if(!is_user_logged_in()) wp_redirect('/login/'); ?>

KKumar KKumar
6 jul 2016 13:30:00

Amablemente me gustaría verificar la solución de la pregunta en StackOverflow...

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
6 jul 2016 13:46:19
1

Sé que es tarde, pero publico la solución para que pueda ayudar a alguien que lo necesite en este momento.

Esto es lo que estoy haciendo y funciona perfectamente.

function redirect_user_tologin(){
  global $post;
  $post_slug = $post->post_name;

  if(!is_user_logged_in()){
      if($post_slug == 'my-account') { //se pueden agregar múltiples condiciones

          //crear enlace dinámico de redirección
          $redirect = urlencode(site_url().'/'.$post_slug);

          //redirección
          wp_safe_redirect(site_url().'/wp-login.php/?redirect_to=' .$redirect);
          exit;
       }
   }
}
add_action('wp', 'redirect_to_login');

Explicación

Si el usuario no ha iniciado sesión, entonces wp_safe_redirect lo llevará a la página de inicio de sesión.

Para redirigir al usuario después del login, pasamos el enlace de la página como valor en el parámetro redirect_to para que lo lleve a esa página específica.

URL de la página de login: site_url().'/wp-login.php/'

Enlace de redirección: redirect_to=' .$redirect

20 ene 2020 08:05:33
Comentarios

Gracias...

Praveen Kumar Purushothaman Praveen Kumar Purushothaman
21 ene 2020 22:21:25