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 ...
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?
Comme demandé, voici un peu plus d'explication ...
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
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.
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.