私が開発しているウェブサイトでは、私はすべてのログイン関連のフォームがカスタムのブランドのページにある必要があります。私はそれらすべてをほとんど網羅していますが、正しく管理できないケースが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
にリダイレクトされ、対応するエラーメッセージが表示されます。
私はこの特定のケースでラッチするアクションやフィルタを見つけることができないようです。グーグルは残念ながら助けにはならず、ここにある同様の質問はすべてこの非常に特殊なケースを扱っていないようです。
何か案は?事前に感謝し、素敵な一日を!
これを試して:
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
ページでフォームをレンダリングすることを続けます。このアクションを使用することで、その直前にこの手順にフックできます。
一時的に何らかの回避策を見つけましたが、実際には正確ではありませんので、まだアイデアを受け入れています。 :)
フィルターを外しました
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
エラーとして隠します。目的には合っていますが、あまりきれいではありません。