web-dev-qa-db-fra.com

wp_get_referer ne fonctionne pas correctement après wp_redirect

Merci pour la lecture! Il y a beaucoup de redirection sur le site que je crée.

Par exemple,

  • s'il n'est pas connecté, accédez à une page "privée", il sera redirigé vers une page de connexion personnalisée.

  • si l'utilisateur se connecte, il sera redirigé vers la dernière page visitée avant d'accéder au formulaire de connexion.

Appelons les pages "Profile" et "LogIn".

Donc, si tout va bien devrait être:

-> non connecté essayer d'accéder profil -> redirection vers LogIn - > si OK redirige vers Profil

Cependant, lorsque LogIn appelle wp_get_referer (), il ne renvoie PAS Profile . Au lieu de cela il va "2 pages" en arrière.

Est-ce que "wp_get_referer ()" n'est pas Profile comme référent car agit comme une redirection. Tout comme le bouton "Retour" dans le navigateur le ferait.

Si vous accédez à la connexion via une page "publique" (en cliquant sur le lien), la redirection après la connexion fonctionne correctement.

page-profile.php

if( !is_user_logged_in() ) {    
    wp_redirect( get_permalink(37) ); //id 37 = page-login.php
    exit;
}

page-login.php

//Set referer
$referer = wp_get_referer();
if( !$referer || referer_is_login_page($referer) )
    $referer = get_bloginfo('url');
simpleSessionSet('login_referer', $referer);

... 
//Log the user in 
...

if ( is_wp_error($user_id) )            
    $errores = TRUE;
else 
    wp_redirect( simpleSessionGet('login_referer', '') );
1
bysanchy

Grâce à @Tom J Nowell, j'ai trouvé cela, qui garde l'essence du code et laisse l'URL beaucoup plus propre, mais dans la majorité des cas, $ _GET n'est pas nécessaire

page-profile.php

if( !is_user_logged_in() ) {    
    $redirect = url_add_parameter( get_permalink(37), 'redirect_to='.get_permalink() ); // Adds a parameter to the URL checks if '&' or '?' are being used already
    wp_redirect( $redirect );
    exit;
}

page-login.php

// Set referer
if( $_GET['redirect_to'] ) 
    $referer = $_GET['redirect_to']; //When the referer page was a redirection
else
    $referer = wp_get_referer();

if( !$referer || referer_is_login_page($referer) )
    $referer = get_bloginfo('url');

simpleSessionSet('login_referer', $referer);

... 
//Log the user in 
...

if ( is_wp_error($user_id) )            
    $error = TRUE;
else 
    wp_redirect( simpleSessionGet('login_referer', '') );
0
bysanchy

Ne vous embêtez pas avec le simpleSessionGet, faites plutôt ce que WordPress lui-même fait et utilisez un paramètre get

par exemple.

$current_url = $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
wp_redirect( get_permalink(37).'?redirect_to='.$current_url);

Ensuite, dans votre redirection, effectuez quelque chose de similaire à:

wp_redirect( $_GET['redirect_to'] );
1
Tom J Nowell