web-dev-qa-db-ja.com

Lost_password中に無効なEメールを傍受する

私が開発しているウェブサイトでは、私はすべてのログイン関連のフォームがカスタムのブランドのページにある必要があります。私はそれらすべてをほとんど網羅していますが、正しく管理できないケースが1つだけあります。

パスワードを忘れた場合のカスタムページを設定しましたか。 page、以下のフィルタを追加してから、 Insert emailをレンダリングするカスタムテンプレートを使用して新しいページを作成する フォーム。

function custom_lost_password_page( $lostpassword_url, $redirect ) {
    return home_url( '/lost-password/' );
}
add_filter( 'lostpassword_url', 'custom_lost_password_page', 10, 2 );

ページテンプレートで、リクエストが成功したときに特定のメッセージを含むカスタムログインページにリダイレクトされるように、カスタムのredirect_to入力フィールドを設定しました。

<input type="hidden" name="redirect_to" value="<?= site_url('/login?resetlink=sent') ?>">

ここまでは順調ですね。傍受できないようですが、ユーザーが存在しない電子メールを入力したときです。その場合、とにかく、私は望まないネイティブのWPページである/wp-login.php?action=lostpasswordにリダイレクトされ、対応するエラーメッセージが表示されます。

Invalid email screen

私はこの特定のケースでラッチするアクションやフィルタを見つけることができないようです。グーグルは残念ながら助けにはならず、ここにある同様の質問はすべてこの非常に特殊なケースを扱っていないようです。

何か案は?事前に感謝し、素敵な一日を!

2
GigiSan

これを試して:

add_action( 'lost_password', 'wpse316932_redirect_wrong_email' );
function wpse316932_redirect_wrong_email() {
    global $errors;

    if ( $error = $errors->get_error_code() ) {
        wp_safe_redirect( 'lost-password/?error=' . $error );
    } else {
        wp_safe_redirect( 'lost-password/' );
    }    
}

これはパスワード紛失フォームの直前に起動する lost_passwordアクションフック を利用しています。

WPはエラーがない場合にredirect_to入力フィールドで指定したURLにのみリダイレクトされるため、これが発生していました。フォームの処理中にエラーが見つかった場合(これは明らかなケースです)、単にwp-login.phpページでフォームをレンダリングすることを続けます。このアクションを使用することで、その直前にこの手順にフックできます。

2
dboris

一時的に何らかの回避策を見つけましたが、実際には正確ではありませんので、まだアイデアを受け入れています。 :)

フィルターを外しました

function custom_lost_password_page( $lostpassword_url, $redirect ) {
    return home_url( '/lost-password/' );
}
add_filter( 'lostpassword_url', 'custom_lost_password_page', 10, 2 );

代わりにlost_passwordに対するアクションを追加しました

function custom_lost_password_page() {
    // If the referrer is lost-password then it's a failed attempt,
    // show the form again with an error
    if (strstr($_SERVER['HTTP_REFERER'], 'lost-password')) {
        wp_redirect(home_url('/lost-password?error=invalidemail'));    
    }
    else {
        wp_redirect(home_url('/lost-password/'));
    }
}
add_action( 'lost_password', 'custom_lost_password_page', 10, 0 ); 

見ての通り、それはそれ自身からの全ての呼び出しをインターセプトし、起こり得るエラーをinvalidemailエラーとして隠します。目的には合っていますが、あまりきれいではありません。

0
GigiSan