web-dev-qa-db-ja.com

ログイン成功時にリダイレクトする

ログインが成功した後のリダイレクトを制御するために、次のスニペットを使用しています。

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がwww.mydomain.com/?login=incorrectの場合は、ホームページにリダイレクトします
  • $ referrerがwww.mydomain.com/?login=emptyの場合は、ホームページにリダイレクトします。
  • それ以外のものはすべて$ referrerにリダイレクトします

どのような$ referrerであっても、同じものにリダイレクトされるだけなので、私のロジックには問題があると思います。明らかな何かが足りない?

更新

要求されたように、ここでもう少し説明があります...

  • 誰かが私のカスタムWordPressログインページ(www.mydomain.com)に行きます。
  • 彼らは間違ったパスワードまたはユーザー名でログインしようとします。
  • 以下の関数が実行されます...

    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が追加される方法です、私はおそらくそれを間違った方法で進めています

3
fightstarr20

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が正しく設定されているかどうかを確認してください。

5
Pat J

欲しいもの: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_redirectwp_safe_redirect()を使用し、この関数はリダイレクトとしてローカルターゲットのみを受け入れるため、これが必要です。

2
Ralf912