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


16

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

ユーザーにメールとパスワードのみを入力してほしい。
これらの2つのパラメーターのみに基づいて新しいユーザーを作成する必要があります。

それは可能ですか?もし可能なら、どのように?


回答:


11

絶対にYES、これを達成できます。

ルール1: WordPressにはユーザー名が必要です。ユーザー名を提供する必要があります。

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

ユーザー名フィールドを非表示にしてメールを取得し、ユーザー名として保存することでこれを実現できます。

ステップ-1:ユーザー名テキストフィールドを削除する

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);

ステップ-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/


4

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');

私は交換して、私は、「不正な文字」エラーメッセージが出た@し、.ユーザ名として電子メールアドレスに:$_POST['user_login'] = str_replace(array('@', '.'), '_', $_POST['user_email']);
GreatBlakes

4

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

注: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が示唆するような条件からそれを削除したほうがよいでしょう。


2

@ nishant-kumarの答えを繰り返して、ここにバニラJS、余分なjsスクリプト、1ステップ、バックエンドの編集が不要、メール入力のみでサインアップフォームを作成するソリューションがあります:

/** 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ファイル(またはカスタムプラグインがある場合は追加)に追加するだけです。


1
私はこれを試してみましたが、エラーが発生しましたuser_email is not defined at HTMLInputElement.syncUserName。上の関数内で「関数syncUserName」部分を移動すると、エラーが除去され、コードスニペットが大幅に機能します。他の人が同じ問題に遭遇する可能性があるようにコメントしてください。ありがとうGfra54。
ベティ

あなたは絶対に正しい@bettyです、私は私の答えを修正してuser_emailvarを同じスコープに入れました。ありがとう。
Gfra54

1

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

あなたがハッキングで大丈夫なら、ここに働くことができる概念があります:

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.