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
.

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.

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

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

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

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.

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

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

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

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?

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.

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.

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.

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.

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/');
?>

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

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
