ログインが成功した後のリダイレクトを制御するために、次のスニペットを使用しています。
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 );
}
}
私がやりたいことはこれです...
どのような$ referrerであっても、同じものにリダイレクトされるだけなので、私のロジックには問題があると思います。明らかな何かが足りない?
要求されたように、ここでもう少し説明があります...
以下の関数が実行されます...
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;
}
}
これが?login = incorrectが追加される方法です、私はおそらくそれを間違った方法で進めています
wp_redirect()
のコーデックスページによると、あなたはあなたのwp_redirect()
呼び出しを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;
}
}
それでもうまくいかない場合は、wp_redirect()
呼び出しをコメントアウトしてからecho( $referrer );
を呼び出し、$referrer
が正しく設定されているかどうかを確認してください。
欲しいもの:GET-varの 'login'が 'incorrect'または 'empty'に設定されている場合は、ユーザーをホームページにリダイレクトしてください。そうでなければ、指示者が何であるかに彼をリダイレクトします。
しかしwp-login
のようなフックはありません。しかしlogin_redirect
という便利なフックがあります。
そして問題があります: PHPマニュアルは$_SERVER['HTTP_REFERER']
について述べています :
現在のページをユーザエージェントに参照させているページのアドレス(もしあれば)。これはユーザエージェントによって設定されます。すべてのユーザーエージェントがこれを設定するわけではなく、HTTP_REFERERを機能として変更する機能を提供するものもあります。一言で言えば、それは本当に信頼することはできません。
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;
}
このスクリプトで終わります。最初は右フック(login_redirect
)を使ってください。これはフィルタであり、1つの値、リダイレクト先を受け入れます。そのため、私たちの関数は新しいまたは修正されたリダイレクト先を返すべきです。
私たちの関数でGET-var login
を取得し、それが受け入れられた値( 'incorrect'または 'empty')の1つに設定されているかどうかチェックします。そうであれば、リダイレクト先をホームページ(site-url)に設定します。
そうでない場合は、$_SERVER['HTTP_REFERER']
の値を取得してください。上記のように、この値を信頼することはできません。したがって、$_SERVER['HTTP_REFERER']
が空または使用できない場合はデフォルト値を設定してください。
最後に、リダイレクト先(おそらくリファラー)がブログと同じホスト上にあるかどうかを確認します。 login_redirect
はwp_safe_redirect()
を使用し、この関数はリダイレクトとしてローカルターゲットのみを受け入れるため、これが必要です。