web-dev-qa-db-ja.com

Eメールをユーザー名として登録する

私はWordpress MultisiteでWordpress 4.9.4を使用しています、そして私はユーザ名として彼らの電子メールアドレスを使用して登録することをユーザに許可する必要があります。私が達成できないのは、ms-functions.phpに、az以外の文字を持つユーザー名をフィルタリングする正規表現があるからです。小文字(az)と数字を使用してください。 "私はms-functions.phpのその正規表現を変更しました、そしてそれはうまく働きます。私の質問は、ワードプレスを更新するたびにwpmu_validate_user_signup関数を書き直す必要がないようにすることです。この問題に関する良い習慣は何でしょうか。 theme_childに別のincludes/ms-functions.phpを作成する必要がありますか?もしそうなら、私はこの関数のみを作成できますか、それとも全体のms-functions.phpをコピーしなければなりませんか?

ありがとう

2
Gonzalo

WordpressはデフォルトでURLの一部としてユーザー名を使用するため、電子メールをユーザー名として使用することはできません(たとえば、作成者ページ)。そのため、ユーザーに電子メールアドレスを登録させるだけでは十分ではありません。URL関連の問題を処理するためのコードも必要です。

とにかくこれは XY問題 のように聞こえます。ユーザーは自分の電子メールアドレスでログインできるため、登録時に作成されたログインハンドルを実際に気にする人がいるのはなぜでしょうか。最も簡単な方法は、登録フォームを作成することです。登録フォームでは、ユーザーに「サニタイズされた」ユーザー名を彼の電子メールに基づいて作成させます。

2
Mark Kaplun

これはGonzaloのフィルタのより安全なバージョンで、「ユーザ名には小文字(a-z)と数字しか含めることができません」という検証エラーのみが削除されます。代わりに同様の検証を使用しますが、sanitize_email()で見られるのと同じ文字を許可します。

唯一の注意点は、これがエラーメッセージ名をチェックすることです。 WordPressが将来そのエラーメッセージを変更した場合、これは機能しなくなります。しかし、それがその特定の検証メッセージをターゲットにする唯一の方法です。

/**
 * Allow users to sign up using an email address as their username. 
 * Removes the default restriction of [a-z0-9] and replaces it with [a-z0-9+_.@-].
 *
 * @param $result
 *
 * @return array $result
 */
function wpse_295037_disable_username_character_type_restriction( $result ) {
    $errors = $result['errors'];
    $user_name = $result['user_name'];

    // The error message to look for. This should exactly match the error message from ms-functions.php -> wpmu_validate_user_signup().
    $error_message = __( 'Usernames can only contain lowercase letters (a-z) and numbers.' );

    // Look through the errors for the above message.
    if ( !empty($errors->errors['user_name']) ) foreach( $errors->errors['user_name'] as $i => $message ) {

        // Check if it's the right error message.
        if ( $message === $error_message ) {

            // Remove the error message.
            unset($errors->errors['user_name'][$i]);

            // Validate using different allowed characters based on sanitize_email().
            $pattern = "/[^a-z0-9+_.@-]/i";
            if ( preg_match( $pattern, $user_name ) ) {
                $errors->add( 'user_name', __( 'Username is invalid. Usernames can only contain: lowercase letters, numbers, and these symbols: <code>+ _ . @ -</code>.' ) );
            }

            // If there are no errors remaining, remove the error code
            if ( empty($errors->errors['user_name']) ) {
                unset($errors->errors['user_name']);
            }
        }
    }

    return $result;
}
add_filter( 'wpmu_validate_user_signup', 'wpse_295037_disable_username_character_type_restriction', 20 );
1
Radley Sustaire

私はウェブサイトで別の解決策を見つけました。このコードを登録プラグイン(この場合はGravity Forms)のクラスの先頭に追加すると、検証が無効になり、電子メールをユーザー名として使用できるようになります。

function custom_register_with_email($result) {

   if ( $result['user_name'] != '' && is_email( $result['user_name'] ) ) {

      $result['errors']->remove('user_name');

   }

   return $result;
}
add_filter('wpmu_validate_user_signup','custom_register_with_email');
1
Gonzalo