私はまだwp-login.php
をそこにたどり着く方法を知っているユーザーに利用可能なままにしている間、私はブログのために見えないフロントエンドログインをすることを試みています。 wp-login.php
はフロントエンドログインを認証するためにも必要であるため、完全に削除することはできません。
もうすぐそこにありますが、ログイン失敗、特に空のユーザー名に関する問題が1つあります。
ユーザーがwp-login.php
に直接アクセスしたときに同じ理由でエラーが表示されないようにしながら、空のユーザー名/パスワードエラーに対してwp-login.php
が表示されないようにする方法を知っている人はいますか?
wp_login_failed
フックを見つけて、以下の関数を作成しました。基本的には、ログインが失敗したこと、およびユーザーをフロントエンドログインにリダイレクトする前に入力されたユーザー名を確認するためのクエリ引数を追加します。クエリ引数を使用して、ログインが失敗した理由を特定し、ユーザーにメッセージを表示できます。
add_action('wp_login_failed', 'djg_front_end_login_fail');
function djg_front_end_login_fail($username){
$referrer = (isset($_SERVER['HTTP_REFERER'])) ? $_SERVER['HTTP_REFERER'] : $_SERVER['PHP_SELF'];
$referrer = add_query_arg('result', 'failed', $referrer);
$referrer = add_query_arg('username', $username, $referrer);
if(!empty($referrer) && !strstr($referrer, 'wp-login') && !strstr($referrer, 'wp-admin')) :
wp_redirect($referrer);
exit;
endif;
}
しかし、usernameフィールドが空の場合はリダイレクトされず、代わりにwp-login.php
が表示されていることに気付きました。
さらに調べてみると、最初のログインエラーがempty_username
またはempty_password
のいずれかである場合にwp_login_failed
アクションフックが追加されていないことに気付いたwp_authenticate()
関数が見つかりました。これに対処するために、私はauthenticate
フィルタフックを使用し、実際には前述のエラーのコードを変更し、それらのコードにdjg_
を追加して、それらが無視されないようにしました。
add_filter('authenticate', 'djg_authenticate_login', 99, 3);
function djg_authenticate_login($user, $username, $password){;
if(is_wp_error($user)) :
$codes = $user->get_error_codes();
$messages = $user->get_error_messages();
$user = new WP_Error;
for($i = 0; $i <= count($codes) - 1; $i++) :
$code = $codes[$i];
if(in_array($code, array('empty_username', 'empty_password'))) :
$code = 'djg_' . $code;
endif;
$user->add($code, $messages[$i]);
endfor;
endif;
return $user;
}
これはうまくいきますが、ユーザがwp-login.php
ページに直接アクセスすると( Background で説明されているように)利用可能なままでなければならない場合、エラーが表示されます -
エラー:ユーザー名フィールドが空です。
エラー:パスワード欄が空です。
最後に、たくさんの髪の毛を引っ張った後、私はwp_signon()
関数でこれを引き起こしているコードを見つけました、しかし私の目には私がスニペットのまわりでどこでも振る舞いを変えることを可能にするフィルタを見ることができません。基本的には、エラーが正確にempty_username
とempty_password
である場合は無視してください。 -
if ( is_wp_error($user) ) {
if ( $user->get_error_codes() == array('empty_username', 'empty_password') ) {
$user = new WP_Error('', '');
}
return $user;
}
wp_authenticate()
は/wp-includes/pluggable.php
にありますauthenticate
フィルタフックはwp_authenticate()
関数内にあります。wp_login_failed
アクションフックはwp_authenticate()
関数内にあります。wp_signon()
は/wp-includes/user.php
にありますユーザーが空のユーザー名のエラーに対してwp-login.php
の表示を停止すると同時に、同じ理由でユーザーがwp-login.php
にアクセスしたときにエラーが表示されないようにする方法を知っている人はいますか。
WordPressは2つの方法で失敗したログインを処理します。
wp_login_failed
によって取得できます。wp_login_failed
アクションがこの原因/イベントを捉えますここで行ったことについては、コード内のコメントを参照してください。
add_filter( 'authenticate', function( $user, $username, $password ) {
// forcefully capture login failed to forcefully open wp_login_failed action,
// so that this event can be captured
if ( empty( $username ) || empty( $password ) ) {
do_action( 'wp_login_failed', $user );
}
return $user;
}, 10, 3 );
// to handle even you can handle the error like
add_action( 'wp_login_failed', function( $username ) {
if ( is_wp_error( $username ) ) {
// perform operation on error object for empty error
}
} );