web-dev-qa-db-fra.com

Comment rediriger après la connexion en obtenant une variable de l'URL (par exemple avec la langue)

J'utilise le formulaire de connexion par défaut. Je veux que les utilisateurs ayant un certain rôle soient redirigés après la connexion réussie à la page d’accueil, mais dans la langue utilisée par cet utilisateur au moment de la connexion.

Il s’agit d’une ancienne installation WP qui utilise mqTranslate pour donner une fonctionnalité multilingue à WP. Il existe donc un paramètre dans url qui a la valeur de langue dans le cas de la deuxième langue ainsi que dans les formulaires de connexion, d’enregistrement et de perte de mot de passe afin de montrer à chaque utilisateur la forme de langue adéquate. Lorsqu'un utilisateur s'est connecté avec succès, je dois le rediriger vers son domicile dans sa langue.

Voici les filtres pour généralement construire des liens vers les formulaires dans la langue choisie par l'utilisateur:

add_filter( 'login_url', 'my_login_page', 10, 2 );
function my_login_page( $login_url, $redirect ) {
    $redirect = qtrans_getLanguage();
    if($redirect == '') $redirect = $_GET['lang'];
    $new_login_url = site_url() . '/wp-login.php?lang=' .  $redirect;
    return $new_login_url;
}

add_filter( 'register_url', 'my_reg_page' );
function my_reg_page( $register_url ) {
    $lang = qtrans_getLanguage();
    if($lang == '') $lang = $_GET['lang'];
    return site_url() . '/wp-login.php?action=register&lang=' . $lang;
}

add_filter( 'lostpassword_url', 'my_lostpwd_page' );
function my_lostpwd_page( $lostpassword_url, $redirect = 'es') {
    $redirect = qtrans_getLanguage();
    if($redirect == '') $redirect = $_GET['lang'];
    return site_url() . '/wp-login.php?action=lostpassword&lang=' . $redirect;
}

Jusque là tout est correct, mon problème est lorsque j'essaie de rediriger le formulaire de connexion après s'être connecté avec succès à la page d'accueil dans la langue souhaitée.

// Redirect non-admins to the homepage after logging into the site.
function aux_login_redirect( $redirect_to, $request, $user  ) {
    if($_GET['lang'] === 'en') :
        $langvar = 'en';        
    elseif($_GET['lang'] === 'es') : 
        $langvar = 'es';
    else :
        $lang = qtrans_getLanguage();
        $langvar = $lang;
    endif;
    return ( is_array( $user->roles ) && in_array( 'administrator', $user->roles ) ) ? admin_url() : site_url() . "/?lang=" . $langvar; 
} 
add_filter( 'login_redirect', 'aux_login_redirect', 10, 3 );

Comme je peux le constater dans mes tests, login_redirect est déclenché deux fois, la première fois que l'utilisateur arrive à la page de connexion. À ce moment, le filtre peut toujours lire la variable $ _GET ['lang'], mais lorsque l'utilisateur remplit le formulaire et Cliquez sur le bouton pour vous connecter, puis le filtre est activé toutes les secondes, puis l'URL a perdu les variables et la redirection vers la page d'accueil souhaitée n'est pas effectuée.

http://domain.com/wp-login.php?lang=en doit rediriger vers http://domain.com/?lang=en

J'ai aussi essayé avec $ _SESSION ou des variables globales, mais comme le filtre est appelé avant que le login ne soit envoyé, et après le chargement de la page sans les variables en seconde minute, toutes les informations supplémentaires sont perdues.

J'ai désactivé tous les plugins et essayé sans eux et le problème persiste. Je ne sais pas si le comportement par défaut inclut le chargement deux fois du formulaire de connexion et, dans tous les cas, ce serait bien si quelqu'un avait des suggestions sur la manière de réaliser la redirection souhaitée.

Merci d'avance

1
nuriarai

J'ai fini par encoder l'URL de redirection. utiliser php dans mon cas ('http://example.com/wp-login.php?redirect_to='.urlencode(http://example.com/specificpage/?parameter1=dog&parameter2=dog&parameter3=cat));)

Maintenant ça marche!

1
Nori