web-dev-qa-db-fra.com

Redirection en cas de connexion réussie

J'utilise l'extrait de code suivant pour contrôler les redirections après des connexions réussies ....

add_action( 'wp_login', 'redirect_on_login' ); // hook failed login
function redirect_on_login() {
            $referrer = $_SERVER['HTTP_REFERER'];
            $homepage = get_option('siteurl');
            if (strstr($referrer, 'incorrect')) {
            wp_redirect( $homepage );
            }
            elseif (strstr($referrer, 'empty')) {
            wp_redirect( $homepage );
            }
            else
            {  
            wp_redirect( $referrer );
            }
        }

Ce que je veux, c'est ça ...

  • Si $ referrer est www.mondomaine.com/?login=incorrect, redirigez-le vers la page d'accueil.
  • Si $ referrer est www.mondomaine.com/?login=empty, redirigez-le vers la page d'accueil.
  • Tout le reste, puis rediriger vers $ referrer

Je suis sûr que quelque chose ne va pas dans ma logique car tout ce que $ referrer me renvoie tout simplement. Est-ce que je manque quelque chose d'évident?

METTRE À JOUR

Comme demandé, voici un peu plus d'explication ...

  • Quelqu'un va sur ma page de connexion WordPress personnalisée à l'adresse www.mondomaine.com
  • Ils essaient de se connecter avec un mot de passe ou un nom d'utilisateur incorrect
  • La fonction suivante s'exécute ...

    add_action( 'wp_login_failed', 'pu_login_failed' ); // hook failed login
    function pu_login_failed( $user ) {
        // check what page the login attempt is coming from
        $referrer = $_SERVER['HTTP_REFERER'];
        $loginpage = 'http://www.mydomain.com/login';
        // check that were not on the default login page
        if ( !empty($referrer) && !strstr($referrer,'wp-login') && !strstr($referrer,'wp-admin') && $user!=null ) {
            // make sure we don't already have a failed login attempt
            if ( !strstr($referrer, '?login=failed' )) {
                // Redirect to the login page and append a querystring of login failed
                wp_redirect( $loginpage . '/?login=incorrect');
            } else {
                wp_redirect( $referrer );
            }
            exit;
        }
    }
    

C’est ainsi que le? Login = incorrect est ajouté, j’y vais probablement de la mauvaise façon

3
fightstarr20

Selon la page du Codex pour wp_redirect() , vous devez suivre vos appels wp_redirect() avec exit.

add_action( 'wp_login', 'redirect_on_login' ); // hook failed login
function redirect_on_login() {
    $referrer = $_SERVER['HTTP_REFERER'];
    $homepage = get_option('siteurl');
    if (strstr($referrer, 'incorrect')) {
        wp_redirect( $homepage );
        exit;
    } elseif (strstr($referrer, 'empty')) {
        wp_redirect( $homepage );
        exit;
    } else {  
        wp_redirect( $referrer );
        exit;
    }
}

Si cela ne fonctionne pas, essayez de commenter vos appels wp_redirect(), puis echo( $referrer ); pour voir si $referrer est défini correctement.

5
Pat J

Ce que vous voulez: Si le paramètre "login" de GET-var est défini sur "incorrect" ou sur "vide", redirigez l'utilisateur vers la page d'accueil. Sinon, redirigez-le vers le référant.

Mais il n'y a pas d'hameçon comme wp-login. Mais il existe un crochet utile appelé login_redirect.

Et il y a un problème: Le manuel PHP dit à propos de $_SERVER['HTTP_REFERER'] :

L'adresse de la page (le cas échéant) qui a référé l'agent d'utilisateur à la page en cours. Ceci est défini par l'agent utilisateur. Tous les agents utilisateurs ne le définiront pas, et certains offrent la possibilité de modifier HTTP_REFERER en tant que fonctionnalité. En bref, on ne peut pas vraiment faire confiance.

add_action( 'login_redirect', 'redirect_on_login' );

function redirect_on_login( $redirect_to ) {

  $homepage = get_site_url();

  // get whatever is stored in the GET-var 'login'
  $login = filter_input( INPUT_GET, 'login', FILTER_SANITIZE_STRIPPED );

  // if the content of 'login' is in the group (here as array), redirect to the homepage
  if ( in_array( $login, array( 'incorrect', 'empty' ) ) ) {

    return $homepage;

  } else {

    // $_SERVER['HTTP_REFERER'] cannot really be trusted and $referrer can be empty.
    // setup a default location for redirecting.
    // @see: http://php.net/manual/en/reserved.variables.server.php
    $referrer = ( isset( $_SERVER['HTTP_REFERER'] ) && ! empty( $_SERVER['HTTP_REFERER'] ) ) ?
      $_SERVER['HTTP_REFERER'] : $homepage;

    // wp-login.php use wp_safe_redirect, this means only pages on the same domain are accepted
    // @see: http://codex.wordpress.org/Function_Reference/wp_safe_redirect

    // get the Host of our blog (strip scheme like http:// and https://)
    $Host = parse_url( $homepage, PHP_URL_Host );

    // check if the referrer is on the same Host as the blog
    $redirect_to = ( false != stristr( $referrer, $Host ) ) ?
        $referrer : $homepage;

    return $redirect_to;

  }

  // if everything fails, return the original value
  return $redirect_to;

}

Nous allons nous retrouver dans ce script. Au début, utilisez le crochet droit (login_redirect). C'est un filtre qui accepte une valeur, la cible de rediretion. Notre fonction doit donc renvoyer une cible de redirection nouvelle ou modifiée.

Dans notre fonction, obtenez GET-var login et vérifiez si elle est définie sur l'une des valeurs acceptées ('incorrect' ou 'vide'). Si tel est le cas, définissez la cible de la redirection sur la page d'accueil (site-url).

Sinon, essayez d'obtenir la valeur de $_SERVER['HTTP_REFERER']. Comme mentionné ci-dessus, nous ne pouvons pas faire confiance à cette valeur, donc définissez une valeur par défaut si $_SERVER['HTTP_REFERER'] est vide ou quelque chose que nous ne pouvons pas utiliser.

Enfin, vérifiez si la cible de la redirection (peut-être le référant) se trouve sur le même hôte que le blog. Cela est nécessaire car login_redirect utilise wp_safe_redirect() et que cette fonction accepte uniquement les cibles locales en tant que redirection.

2
Ralf912