[WordPress]ユーザー登録やログインをメールアドレスのみ(=ユーザー名を不要)に変更する方法

こんばんは、webエンジニアのゾノ( @ozonosho )です。

さて、今日のブログではWordPressでユーザー登録やログインをメールアドレスのみ(=ユーザー名を不要)に変更する方法を紹介したいと思います。

今回は「半角英数字しか利用できないユーザー名はユーザーに表示したくない」という相談をいただいたので実装してみました。

ちなみに完成形のユーザー登録画面はこんな感じです。

たしかに最近のサービスってメールアドレスのみで登録できるのが普通なので、ユーザーIDみたいなものまでユーザーに設定させるのは嫌だなぁと僕も感じることがあります。

そんなわけでさっそく実装方法を見ていきましょう。

WordPressでユーザー登録やログインをメールアドレスのみ(=ユーザー名を不要)に変更する方法

実装は簡単で、functions.phpに下記のコードを追加してください。

//メールアドレスのみでユーザー登録(ユーザー名にメールアドレスを挿入)
function callback_LoginFormRegister(){
  if(isset($_POST['user_login']) && isset($_POST['user_email']) && !empty($_POST['user_email'])) {
    $_POST['user_email'] = stripslashes($_POST['user_email']);
    //ユーザー名にはメールアドレス(ドメイン除く)を挿入する
    list( $local, ) = explode( '@', $_POST['user_email'], 2 );
    $_POST['user_login'] = sanitize_user($local, true);
    $pre_change = $_POST['user_login'];
    //ユーザー名が重複した場合は適当な数値を加える
    while(username_exists($_POST['user_login'])){
        $_POST['user_login'] = $pre_change . '_' . rand(1, 999);
    }
  }
}
add_action('login_form_register', 'callback_LoginFormRegister');

//ユーザー名に関わるエラー判定を解除する
function callback_RegistrationErrors($wp_error, $sanitized_user_login, $user_email){
  if(isset($wp_error->errors['empty_username'])) {
    unset($wp_error->errors['empty_username']);
  }
  if(isset($wp_error->errors['username_exists'])) {
    unset($wp_error->errors['username_exists']);
  }
  return $wp_error;
}
add_filter('registration_errors', 'callback_RegistrationErrors', 10, 3);

//ユーザー名に関するラベルを変更する
function change_loginpage_username_label($label) {
  if (in_array($GLOBALS['pagenow'], array('wp-login.php'))) {
    if ($label == 'ユーザー名またはメールアドレス') { 
      $label = 'メールアドレス';
    }
    if ($label == 'ユーザー名またはメールアドレスを入力してください。新しいパスワードを作成するためのリンクをメールでお送りします。') { 
      $label = 'メールアドレスを入力してください。新しいパスワードを作成するためのリンクをメールでお送りします。';
    }
  }
  return $label;
}
add_filter( 'gettext', 'change_loginpage_username_label' );

//登録フォームのユーザー名入力欄を削除
function callback_LoginHead() {
?>
  <style>
    #registerform > p:first-child{
      visibility: hidden;
      display:none;
    }
  </style>
<?php
}
add_action('login_head', 'callback_LoginHead');           

//メールアドレス欄にフォーカスさせる
function callback_LoginFooter() {
?>
  <script type="text/javascript">
    try {
      document.getElementById('user_email').focus();
    } catch(e) {}
  </script>
<?php
}
add_action('login_footer', 'callback_LoginFooter');

まず大前提として「Wordpressの仕様としてユーザー名を無くすことはできない」ため、ユーザー名にメールアドレスを挿入することで解決します。

1つ目の関数「callback_LoginFormRegister」でその処理を記述しています。
メールアドレスのままユーザー名にしても良いのですが、万が一ユーザー名が表示されてしまったときにメールアドレスが特定されてしまうのはあまりよろしくないので、メールアドレスの@以下のドメインは省く形でユーザー名に登録するようにしました。

2つ目の関数「callback_RegistrationErrors」では、登録フォームでボタンを押された際にユーザー名に関するエラーを省く処理を記述しています。

WordPress側から提供されているフックでは登録フォームのエラー判定前に処理を追加することができないため、エラー判定からユーザー名に関するものを省くことでユーザー名が未記入の状態でも通過させます。

その他の関数については、注釈にあるとおりテキストやデザインを編集しています。

内容はすこし複雑ですが上記コードをコピペするだけでユーザー名が不要のサイトになるので、ぜひ試してみてください。

おわりに

以上、今回の記事ではユーザー登録やログインをメールアドレスのみ(=ユーザー名を不要)に変更する方法を紹介させていただきました。

つくりばのことが気になりましたか?

つくりばは、ココトモ・未来地図を自社で10年以上運営してきた知見をもとに、相談・コミュニティの開発と運営を支援しています。いきなりのご相談でなくて大丈夫です。まずは私たちの実績や考え方をご覧ください。

つくりばについて知る

← WordPressの一覧へ戻る

Webサービスの課題を、まずは無料相談で整理しませんか。

既存サービスの改善、新規立ち上げ、運用サポート、予算内での優先順位づけなど、今の状況に合わせてじっくりお話を伺います。まだ形になっていない段階のご相談も大丈夫です。

  • videocamオンライン対応
  • forum課題整理だけでも歓迎
  • payments概算費用の目安がわかる
無料相談を申し込む