¿Redirigir al usuario a la URL original después del inicio de sesión?
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!

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.

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?

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.

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.

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!

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"]

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/

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].

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

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

¡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.
