WordPress 4.5 からユーザー名に加えてメールアドレスによるログインが可能となりました。
そして、これはデフォルトで有効な状態です。確かにユーザー名を忘れた場合などは便利ではあります。しかし、メールアドレスは自分以外の人が知っている場合や、推測されやすいものであったりする場合もあり、安全性が低下すると考えます。ログイン専用のメールアドレスを作成するのも面倒ではあります。
そこでメールアドレスによるログインを無効にする方法を紹介します。
メールアドレスによるログインを無効化
単純に無効にするだけであれば、下記のコードを functions.php に追加するだけです。
remove_filter( 'authenticate', 'wp_authenticate_email_password', 20 );
ログインフォームのラベルの変更
上記のコードでメールアドレスによるログインは無効化されるのですが、ログインフォームの「ユーザー名またはメールアドレス」ラベルは変更されません。
ログインフォームを表示する wp_login_form テンプレートタグでは login_form_defaults フィルターフックでこのラベルを変更することができます。
function my_login_form_defaults( $defaults ) {
$defaults['label_username'] = __( 'Username' );
return $defaults;
}
add_filter( 'login_form_defaults', 'my_login_form_defaults' );
ただし、ログインページのログインフォームは wp_login_form テンプレートタグを使用しておらず、login_form_defaults フィルターフックも有効ではありません。
適当なフックも用意されていないため、仕方ないので gettext フィルターフックで変更します。
function my_gettext_login( $translated_text, $text, $domain ) {
if ( 'wp-login.php' === $GLOBALS['pagenow'] ) {
if ( $domain == 'default' && $text === 'Username or Email Address' ) {
$translated_text = __( 'Username' );
}
}
return $translated_text;
}
add_filter( 'gettext', 'my_gettext_login', 20, 3 );
親切なエラーメッセージ
序に、ログインページでのログインに失敗したときのエラーメッセージが親切過ぎる(無効なユーザー名の場合は「ユーザー名が無効です。」、有効なユーザー名を入力してパスワードが間違えた場合は「ユーザー名 taro のパスワードが間違っています。」など)ので変更します。
下記コードを追加することで、エラーメッセージが不親切(?)になります。
function my_login_errors( $error_message ) {
return '<strong>エラー</strong>: ユーザー名またはパスワードが間違っています。';
}
add_filter( 'login_errors', 'my_login_errors' );
追記
XO Security プラグイン(バージョン 2.0.0)に、上記機能(メールアドレスによるログインの無効化およびログイン エラー メッセージの汎用化)を組み込みました。