0

There exist a plugin for wordpress to enable usernames containing special characters (Russian, Cyrillic, Arabic …). Unfornetly this plugin didn't work for me. I have even a look at this solution but didn't work too. Here is the function defined to register users in the theme I'm using (QAEngine theme)

public function register(){
    $param = $_REQUEST['content'];
    $args  = array(
        'user_email'    => $param['email'],
        'user_pass'     => $param['password'],
        'user_login'    => $param['username'],
        'display_name'  => isset($param['display_name']) ? $param['display_name'] : $param['username']
    );
    $captcha = isset($_REQUEST['captcha']) ? $_REQUEST['captcha'] : '';
    // validate here, later
    try {

        //verify captcha
        ae_verify_captcha($captcha, __('Please enter a valid captcha!', ET_DOMAIN));

        $role = apply_filters('qa_custom_role', 'author' );
        do_action ('je_before_user_register', $args);

        // apply register & log the user in
        $auto_sign  = ae_get_option( 'user_confirm' ) ? false : true;
        $user_id    = et_register( $args , $role, $auto_sign );

        if ( is_wp_error($user_id) ){
            throw new Exception($user_id->get_error_message() , 401);
        }

        $data     = get_userdata( $user_id );
        $userdata = QA_Member::convert($data);
        // generate new nonces
        $msg = ae_get_option( 'user_confirm' ) ? __('You have registered an account successfully but are not able to join the discussions yet. Please confirm your email address first.', ET_DOMAIN) : __('You are registered and logged in successfully.', ET_DOMAIN) ;
        $response = array(
            'success'       => true,
            'code'          => 200,
            'msg'           => $msg,
            'data'          => $userdata,
            'redirect'      => apply_filters( 'qa_filter_redirect_link_after_register', home_url() )
        );

    } catch (Exception $e) {
        $response = array(
            'success' => false,
            'code'    => $e->getCode(),
            'msg'     => $e->getMessage()
        );
    }
    wp_send_json( $response );
}

Here you could find a complete php file in which this function is declared.

Any recommendation for how to allow non-latin characters in usernames?

Update

After looking for other similar questions, I must clarify that I'm working on a multisite and I found that some given solutions are about hooking wpmu_validate_user_signup filter in multisite case (Here an example). So I add the given code to my function.php file but this didn't solve the problem even if I keep the code for hooking the sanitize_user filter.

However, when I made changes in the wordpress core I mean in /wp-includes/ms-functions.php#L452.

if ( $user_name != $orig_username || preg_match( '/[^a-z0-9]/', $user_name ) ) {

to

if ( $user_name != $orig_username || preg_match( '/^[\p{Arabic}a-z0-9 _.\-@]/', $user_name ) ) {

and in /wp-includes/formatting.php#L2095 from

$username = preg_replace( '|[^a-z0-9 _.\-@]|i', '', $username );

to

$username = preg_replace( '|^[\p{Arabic}a-z0-9 _.\-@]|i', '', $username );

This enables me to register new users with non-latin characters in the backend. However, I can't log in with the new registered usernames in non-latin characters, either register users with no-latin characters from the frontend of my multisite.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.