web-dev-qa-db-ja.com

ログイン後にurlから変数を取得した後にリダイレクトする方法(例えば言語で)

デフォルトのログインフォームを使います。特定の役割を持つユーザーは、ホームページへのログインに成功した後でリダイレクトされますが、ログインの瞬間にユーザーが使用している言語でリダイレクトされます。

これは、WPに多言語機能を提供するためにmqTranslateを使用する古いWPインストールです。したがって、すべてのユーザーに適切な言語形式を表示するために、urlには第2言語の場合の言語の値、およびログイン、登録、パスワードを失った形式のパラメータがあります。ユーザーが正常にログインしたら、自分の言語で彼を自宅にリダイレクトする必要があります。

これは、一般に、ユーザーが選択した言語でフォームへのリンクを構築するためのフィルターです。

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;
}

ここまですべてが正しいのですが、私の問題は、希望する言語でホームページに正常にログインした後にログインフォームをリダイレクトしようとしたときです。

// 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 );

私のテストでわかるように、login_redirectが2回起動されます。最初はユーザーがログインページに到着したときですが、この時点ではフィルターはまだ$ _GET ['lang']変数を読むことができます。ログインするためにdeボタンをクリックしてください、そしてフィルタは1秒間に起動され、それからURLは変数を失い、目的のホームページへのリダイレクトをしていません。

http://domain.com/wp-login.php?lang=enhttp://domain.com/?lang=にリダイレクトする必要がありますen

$ _SESSIONまたはグローバル変数でも試しましたが、ログインの送信前と送信後にフィルタが呼び出されるので、2番目のタイミングで変数なしでページを読み込むと、すべての追加情報が失われます。

私はすべてのプラグインを無効にしてプラグインなしで試してみましたが、問題は解決しません。デフォルトの振る舞いにログインフォームの2回の読み込みが含まれているかどうかはわかりません。いずれにしても、目的のリダイレクトを実現する方法について誰かが何か提案があればいいでしょう。

前もって感謝します

1
nuriarai

リダイレクトURLをエンコードしました。私の場合はphpを使う( 'http://example.com/wp-login.php?redirect_to='.urlencode(http://example.com/specificpage/?parameter1=dog&parameter2=dog&parameter3=cat));

今それはうまくいきます!

1
Nori