Redireccionar a la página de referencia después de iniciar sesión
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:
- Redireccionar WordPress de vuelta a la página de referencia después del login
- Consejo WordPress: Redireccionar a la página anterior después del login
También he probado estos y fallaron:
- Redirigir usuarios a la página de referencia después de iniciar sesión usando un formulario de login personalizado
- ¿Redirigir usuario a la URL original después del login?
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!
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().
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
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
La función wp_redirect() es pluggable pero también puedes acceder al filtro wp_redirect.
birgire
Puedes sobrescribirla con tu propia función wp_redirect(), pero no lo recomiendo.
birgire
Buena respuesta, pero no logré que funcione en una página de inicio de sesión personalizada.
Praveen Kumar Purushothaman
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
El inicio de sesión personalizado simplemente no funciona. El wp-login.php original sí funciona con la redirección.
Praveen Kumar Purushothaman
Esto no funciona, pero acepto la respuesta por tu duro trabajo. Continuaré esto en StackOverflow. ¿Puedes venir allí?
Praveen Kumar Purushothaman
Vale, gracias, parece que encontraste una solución en Javascript que te funciona allí.
birgire
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 ) ) );
El proyecto murió hace un año. Bueno, ¿qué sentido tiene responder ahora? Porque, ¿acaso leíste la respuesta aceptada anterior?
Praveen Kumar Purushothaman
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
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
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
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.
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
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
Amablemente me gustaría verificar la solución de la pregunta en StackOverflow...
Praveen Kumar Purushothaman
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