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.