web-dev-qa-db-ja.com

登録ページからusernameフィールドを削除することは可能ですか?もしそうなら、どうですか?

登録ページからusernameフィールドを削除することは可能ですか?

ユーザーに自分の電子メールとパスワードだけを入力してもらいたいのです。
新しいユーザーは、これら2つのパラメーターのみに基づいて作成されるべきです。

それは可能ですか?

15
phpnwordpress

絶対にYES、あなたはこれを達成することができます。

規則1: WordPressはユーザー名を要求します。ユーザー名を入力してください。

規則2: WordPressのコアコードを編集しないでください。

これを実現するには、ユーザー名フィールドを非表示にし、電子メールを受信して​​ユーザー名として保存します。

ステップ-1:ユーザー名の削除textfield

add_action('login_head', function(){
?>
    <style>
        #registerform > p:first-child{
            display:none;
        }
    </style>

    <script type="text/javascript" src="<?php echo site_url('/wp-includes/js/jquery/jquery.js'); ?>"></script>
    <script type="text/javascript">
        jQuery(document).ready(function($){
            $('#registerform > p:first-child').css('display', 'none');
        });
    </script>
<?php
});

ステップ2:ユーザー名の削除エラー

//Remove error for username, only show error for email only.
add_filter('registration_errors', function($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;
}, 10, 3);

Step-3:背景登録機能を操作する

add_action('login_form_register', function(){
    if(isset($_POST['user_login']) && isset($_POST['user_email']) && !empty($_POST['user_email'])){
        $_POST['user_login'] = $_POST['user_email'];
    }
});

あなたのテーマの functions.php ファイルに上記のコードを入れてください。

これを実現するための完全なプラグインをダウンロードすることもできます。

プラグイン: https://wordpress.org/plugins/smart-wp-login/

11
Nishant Kumar

ログインは私たちが実際に削除したいものであるので、Nishant Kumarsの投稿のステップ3はisset($_POST['user_login'])が私にとってうまくいかなかったかどうかをチェックします。

私の解決策は、ワードプレスのコードスタイルを維持するための、独立した関数としての、(テーマのfunctions.php内の)次のようなものです。

function copy_username_to_email (){
    if(isset($_POST['user_email']) && !empty($_POST['user_email'])){
        $_POST['user_login'] = $_POST['user_email'];
    }
}
add_action('login_form_register', 'copy_username_to_email');
4
mcnesium

@Nishant Kumarは、この質問に対して完璧で受け入れられるべき答えを与えました。ただし、Wordpress 4.0バージョンのリリース後に不具合があります。 codex -から

注:4.0以降、これらのプロパティはプライベートです。 [28511] を参照してください。

ここのregistration_errorsフィルターは少し変更する必要があります。

//Remove error for username, only show error for email only.

add_filter('registration_errors', 'remove_username_empty_error', 10, 3);

function remove_username_empty_error($wp_error, $sanitized_user_login, $user_email){

    if(isset($wp_error->errors['empty_username'])){
        $wp_error->remove('empty_username');
    }    
    if(isset($wp_error->errors['username_exists'])){
        $wp_error->remove('username_exists');
    }
    return $wp_error;
}

注:@mcnesiumが述べたように、ユーザー名フィールドを完全に削除した場合(私の場合は、ログインプラグインのテーマを使用して通常の登録フォームを上書きし、そこで削除しましたユーザー名フィールド)$_POST['user_login']nullになり、条件はまったく一致しません。 @mcnesiumが示唆するような条件からそれを削除したほうがよいでしょう。

4
maksbd19

@ nishant-kumarの答えを繰り返して、これはVanilla JS、追加のjsスクリプト、1ステップ、バックエンド編集は不要、Eメール入力のみでサインアップフォームを作成するためのソリューションです。

/** Hook your code to the login / Sign up page **/
add_action('login_head', function(){

    /* Style to hide the user_name field group */
    ?>
    <style>
        #registerform > p:first-child{
            display:none;
        }
    </style>

    <script type="text/javascript">
        /* Execute this action when the DOM is ready AND after everything in the page is loaded */
        let user_email;
        window.addEventListener('load',function() {
            user_email = document.querySelector('[name="user_email"]');
            if(user_email) { // Execute only if there is a user_email field on page
                user_email.addEventListener('keyup',syncUserName);
                user_email.addEventListener('change',syncUserName);
            }
        });

        /* sync user_email's value with the hidden user_login field */
        function syncUserName() {
                document.querySelector('[name="user_login"]').value = user_email.value;
        }

    </script>
<?php
});

このコードを functions.php ファイル(または カスタムプラグイン の場合は/)に追加するだけです。

2
Gfra54

Wordpressでは、すべての登録ユーザーにユーザー名を付ける必要があるため、この要求に対する解決策は「ハック」になると思います。上記のプラグインでさえも、ほとんどの場合、Eメールアドレスからユーザー名を見つけ、そのユーザー名を使ってサイトにログインするだけです。

あなたがハックに問題がなければ、これがうまくいく可能性のある概念です。

1)登録フォームのユーザー名フィールドに一意の番号を事前に入力します。現在のタイムスタンプを使用すると、重複を避けることができます。ユーザーがフォームに記入するときに画面に表示されないように、このフィールドを非表示にします。

あなたがjQueryを使っているなら、あなたは以下のようなものを使うことができます:

$(document).ready(function() {
    var timestamp = (new Date).getTime();
    $('form input.username').val(timestamp);
    $('form input.username').css('display', 'none');
});

この例では、 'form input.username'がユーザー名フィールドを検索するjQueryセレクターになります。セレクターが構造と一致することを確認するには、ページ上のhtml構造を確認する必要があります。

2)ユーザーが自分のEメールアドレスでログインできるようにするために、前述のようなプラグイン( http://wordpress.org/extend/plugins/wp-email-login/ )を使用します。

1
Matt Keys