Support » Plugin: WordPress Special Characters in Usernames » Allow åäö/ÅÄÖ

  • Victor

    (@dusemedia)


    Are you planning on adding support for åäö/ÅÄÖ? That would be so appreciated!

Viewing 15 replies - 1 through 15 (of 16 total)
  • johanlinder

    (@johanlinder)

    I second that request. 🙂

    missveronica

    (@missveronicatv)

    I will submit a filter for usernames in Swedish characters soon.

    Limitation will be that you only can have WordPress configured for Profiles Permalinks with userid ie not usernames any more.

    The PHP function sprintf used by many plugins for user links will fail with Swedish characters because sprintf can not handle multibytes (UTF8).

    missveronica

    (@missveronicatv)

    Which user member/manager plugins are you using?

    I have a solution tested with WP User Manager and Ultimate Member.

    https://wordpress.org/plugins/wp-user-manager/

    https://wordpress.org/plugins/ultimate-member/

    Hello!

    @missveronicatv Did you have a solution for ultimate members? Could you please tell me about how you did it?

    // Overrides the WordPress sanitize_user filter
    // to allow Swedish/Danish and English characters only
    // tested with a username: åäöÅÄÖæøåÆØÅÜü
    // will not work with ßẞéèêóòâô

    // Preventing your wp-site from failing in user links
    // you must set WP Profiles Permalinks to UserID
    // The php function used for creating links (sprintf) has no multi byte support

    I can post all the code lines if you are interested.
    I use wp-user-manager and I have only made preliminary tests with ultimate-member.

    Hello @missveronicatv and thank you for your quick reply!
    I would really like to try the code, allthough you’ve only made preliminary tests.
    Please post the code lines and I’ll see if I can make it work!

    <?php
    //  Overrides the WordPress sanitize_user filter 
    //  to allow Swedish/Danish and English characters only
    //  tested with a username: åäöÅÄÖæøåÆØÅÜü
    //  will not work with ßẞéèêóòâô 
    
    //  Requires either WP User Manager or Ultimate Member configured for WP Profiles Permalinks to UserID
    //  Preventing your wp-site from failing in user links you must set WP Profiles Permalinks to UserID
    //  The php function used for creating links (sprintf) has no multi byte support (UTF8)
    //  Warning if you have set max limit of user name length the UM plugin must use mb_strlen for counting UTF8 characters (WPUM is OK)
    
    //  Install by adding or include the code to functions.php in your child theme
    //  Modified by MissVeronica 2019-08-01
    
    function se_dk_remove_accents( $string ) {
    	if ( ! preg_match( '/[\x80-\xff]/', $string ) ) {
    		return $string;
    	}
    
    	if ( seems_utf8( $string ) ) {
    		$chars = array(
    			// Decompositions for Latin-1 Supplement
    			'ª' => 'a',
    			'º' => 'o',
    			'À' => 'A',
    			'Á' => 'A',
    			'Â' => 'A',
    			'Ã' => 'A',
    			//'Ä' => 'A',
    			//'Å' => 'A',
    			//'Æ' => 'AE',
    			'Ç' => 'C',
    			'È' => 'E',
    			'É' => 'E',
    			'Ê' => 'E',
    			'Ë' => 'E',
    			'Ì' => 'I',
    			'Í' => 'I',
    			'Î' => 'I',
    			'Ï' => 'I',
    			'Ð' => 'D',
    			'Ñ' => 'N',
    			'Ò' => 'O',
    			'Ó' => 'O',
    			'Ô' => 'O',
    			'Õ' => 'O',
    			//'Ö' => 'O',
    			'Ù' => 'U',
    			'Ú' => 'U',
    			'Û' => 'U',
    			//'Ü' => 'U',
    			'Ý' => 'Y',
    			'Þ' => 'TH',
    			'ß' => 's',
    			'à' => 'a',
    			'á' => 'a',
    			'â' => 'a',
    			'ã' => 'a',
    			//'ä' => 'a',
    			//'å' => 'a',
    			//'æ' => 'ae',
    			'ç' => 'c',
    			'è' => 'e',
    			'é' => 'e',
    			'ê' => 'e',
    			'ë' => 'e',
    			'ì' => 'i',
    			'í' => 'i',
    			'î' => 'i',
    			'ï' => 'i',
    			'ð' => 'd',
    			'ñ' => 'n',
    			'ò' => 'o',
    			'ó' => 'o',
    			'ô' => 'o',
    			'õ' => 'o',
    			//'ö' => 'o',
    			//'ø' => 'o',
    			'ù' => 'u',
    			'ú' => 'u',
    			'û' => 'u',
    			//'ü' => 'u',
    			'ý' => 'y',
    			'þ' => 'th',
    			'ÿ' => 'y',
    			//'Ø' => 'O',
    			// Decompositions for Latin Extended-A
    			'Ā' => 'A',
    			'ā' => 'a',
    			'Ă' => 'A',
    			'ă' => 'a',
    			'Ą' => 'A',
    			'ą' => 'a',
    			'Ć' => 'C',
    			'ć' => 'c',
    			'Ĉ' => 'C',
    			'ĉ' => 'c',
    			'Ċ' => 'C',
    			'ċ' => 'c',
    			'Č' => 'C',
    			'č' => 'c',
    			'Ď' => 'D',
    			'ď' => 'd',
    			'Đ' => 'D',
    			'đ' => 'd',
    			'Ē' => 'E',
    			'ē' => 'e',
    			'Ĕ' => 'E',
    			'ĕ' => 'e',
    			'Ė' => 'E',
    			'ė' => 'e',
    			'Ę' => 'E',
    			'ę' => 'e',
    			'Ě' => 'E',
    			'ě' => 'e',
    			'Ĝ' => 'G',
    			'ĝ' => 'g',
    			'Ğ' => 'G',
    			'ğ' => 'g',
    			'Ġ' => 'G',
    			'ġ' => 'g',
    			'Ģ' => 'G',
    			'ģ' => 'g',
    			'Ĥ' => 'H',
    			'ĥ' => 'h',
    			'Ħ' => 'H',
    			'ħ' => 'h',
    			'Ĩ' => 'I',
    			'ĩ' => 'i',
    			'Ī' => 'I',
    			'ī' => 'i',
    			'Ĭ' => 'I',
    			'ĭ' => 'i',
    			'Į' => 'I',
    			'į' => 'i',
    			'İ' => 'I',
    			'ı' => 'i',
    			'IJ' => 'IJ',
    			'ij' => 'ij',
    			'Ĵ' => 'J',
    			'ĵ' => 'j',
    			'Ķ' => 'K',
    			'ķ' => 'k',
    			'ĸ' => 'k',
    			'Ĺ' => 'L',
    			'ĺ' => 'l',
    			'Ļ' => 'L',
    			'ļ' => 'l',
    			'Ľ' => 'L',
    			'ľ' => 'l',
    			'Ŀ' => 'L',
    			'ŀ' => 'l',
    			'Ł' => 'L',
    			'ł' => 'l',
    			'Ń' => 'N',
    			'ń' => 'n',
    			'Ņ' => 'N',
    			'ņ' => 'n',
    			'Ň' => 'N',
    			'ň' => 'n',
    			'ʼn' => 'n',
    			'Ŋ' => 'N',
    			'ŋ' => 'n',
    			'Ō' => 'O',
    			'ō' => 'o',
    			'Ŏ' => 'O',
    			'ŏ' => 'o',
    			'Ő' => 'O',
    			'ő' => 'o',
    			'Œ' => 'OE',
    			'œ' => 'oe',
    			'Ŕ' => 'R',
    			'ŕ' => 'r',
    			'Ŗ' => 'R',
    			'ŗ' => 'r',
    			'Ř' => 'R',
    			'ř' => 'r',
    			'Ś' => 'S',
    			'ś' => 's',
    			'Ŝ' => 'S',
    			'ŝ' => 's',
    			'Ş' => 'S',
    			'ş' => 's',
    			'Š' => 'S',
    			'š' => 's',
    			'Ţ' => 'T',
    			'ţ' => 't',
    			'Ť' => 'T',
    			'ť' => 't',
    			'Ŧ' => 'T',
    			'ŧ' => 't',
    			'Ũ' => 'U',
    			'ũ' => 'u',
    			'Ū' => 'U',
    			'ū' => 'u',
    			'Ŭ' => 'U',
    			'ŭ' => 'u',
    			'Ů' => 'U',
    			'ů' => 'u',
    			'Ű' => 'U',
    			'ű' => 'u',
    			'Ų' => 'U',
    			'ų' => 'u',
    			'Ŵ' => 'W',
    			'ŵ' => 'w',
    			'Ŷ' => 'Y',
    			'ŷ' => 'y',
    			'Ÿ' => 'Y',
    			'Ź' => 'Z',
    			'ź' => 'z',
    			'Ż' => 'Z',
    			'ż' => 'z',
    			'Ž' => 'Z',
    			'ž' => 'z',
    			'ſ' => 's',
    			// Decompositions for Latin Extended-B
    			'Ș' => 'S',
    			'ș' => 's',
    			'Ț' => 'T',
    			'ț' => 't',
    			// Euro Sign
    			'€' => 'E',
    			// GBP (Pound) Sign
    			'£' => '',
    			// Vowels with diacritic (Vietnamese)
    			// unmarked
    			'Ơ' => 'O',
    			'ơ' => 'o',
    			'Ư' => 'U',
    			'ư' => 'u',
    			// grave accent
    			'Ầ' => 'A',
    			'ầ' => 'a',
    			'Ằ' => 'A',
    			'ằ' => 'a',
    			'Ề' => 'E',
    			'ề' => 'e',
    			'Ồ' => 'O',
    			'ồ' => 'o',
    			'Ờ' => 'O',
    			'ờ' => 'o',
    			'Ừ' => 'U',
    			'ừ' => 'u',
    			'Ỳ' => 'Y',
    			'ỳ' => 'y',
    			// hook
    			'Ả' => 'A',
    			'ả' => 'a',
    			'Ẩ' => 'A',
    			'ẩ' => 'a',
    			'Ẳ' => 'A',
    			'ẳ' => 'a',
    			'Ẻ' => 'E',
    			'ẻ' => 'e',
    			'Ể' => 'E',
    			'ể' => 'e',
    			'Ỉ' => 'I',
    			'ỉ' => 'i',
    			'Ỏ' => 'O',
    			'ỏ' => 'o',
    			'Ổ' => 'O',
    			'ổ' => 'o',
    			'Ở' => 'O',
    			'ở' => 'o',
    			'Ủ' => 'U',
    			'ủ' => 'u',
    			'Ử' => 'U',
    			'ử' => 'u',
    			'Ỷ' => 'Y',
    			'ỷ' => 'y',
    			// tilde
    			'Ẫ' => 'A',
    			'ẫ' => 'a',
    			'Ẵ' => 'A',
    			'ẵ' => 'a',
    			'Ẽ' => 'E',
    			'ẽ' => 'e',
    			'Ễ' => 'E',
    			'ễ' => 'e',
    			'Ỗ' => 'O',
    			'ỗ' => 'o',
    			'Ỡ' => 'O',
    			'ỡ' => 'o',
    			'Ữ' => 'U',
    			'ữ' => 'u',
    			'Ỹ' => 'Y',
    			'ỹ' => 'y',
    			// acute accent
    			'Ấ' => 'A',
    			'ấ' => 'a',
    			'Ắ' => 'A',
    			'ắ' => 'a',
    			'Ế' => 'E',
    			'ế' => 'e',
    			'Ố' => 'O',
    			'ố' => 'o',
    			'Ớ' => 'O',
    			'ớ' => 'o',
    			'Ứ' => 'U',
    			'ứ' => 'u',
    			// dot below
    			'Ạ' => 'A',
    			'ạ' => 'a',
    			'Ậ' => 'A',
    			'ậ' => 'a',
    			'Ặ' => 'A',
    			'ặ' => 'a',
    			'Ẹ' => 'E',
    			'ẹ' => 'e',
    			'Ệ' => 'E',
    			'ệ' => 'e',
    			'Ị' => 'I',
    			'ị' => 'i',
    			'Ọ' => 'O',
    			'ọ' => 'o',
    			'Ộ' => 'O',
    			'ộ' => 'o',
    			'Ợ' => 'O',
    			'ợ' => 'o',
    			'Ụ' => 'U',
    			'ụ' => 'u',
    			'Ự' => 'U',
    			'ự' => 'u',
    			'Ỵ' => 'Y',
    			'ỵ' => 'y',
    			// Vowels with diacritic (Chinese, Hanyu Pinyin)
    			'ɑ' => 'a',
    			// macron
    			'Ǖ' => 'U',
    			'ǖ' => 'u',
    			// acute accent
    			'Ǘ' => 'U',
    			'ǘ' => 'u',
    			// caron
    			'Ǎ' => 'A',
    			'ǎ' => 'a',
    			'Ǐ' => 'I',
    			'ǐ' => 'i',
    			'Ǒ' => 'O',
    			'ǒ' => 'o',
    			'Ǔ' => 'U',
    			'ǔ' => 'u',
    			'Ǚ' => 'U',
    			'ǚ' => 'u',
    			// grave accent
    			'Ǜ' => 'U',
    			'ǜ' => 'u',
    		);
    
    		// Used for locale-specific rules
    		$locale = get_locale();
    
    		if ( 'de_DE' == $locale || 'de_DE_formal' == $locale || 'de_CH' == $locale || 'de_CH_informal' == $locale ) {
    			$chars['Ä'] = 'Ae';
    			$chars['ä'] = 'ae';
    			$chars['Ö'] = 'Oe';
    			$chars['ö'] = 'oe';
    			$chars['Ü'] = 'Ue';
    			$chars['ü'] = 'ue';
    			$chars['ß'] = 'ss';
    		} elseif ( 'da_DK' === $locale ) {
    			//$chars['Æ'] = 'Ae';
    			//$chars['æ'] = 'ae';
    			//$chars['Ø'] = 'Oe';
    			//$chars['ø'] = 'oe';
    			//$chars['Å'] = 'Aa';
    			//$chars['å'] = 'aa';
    		} elseif ( 'ca' === $locale ) {
    			$chars['l·l'] = 'll';
    		} elseif ( 'sr_RS' === $locale || 'bs_BA' === $locale ) {
    			$chars['Đ'] = 'DJ';
    			$chars['đ'] = 'dj';
    		}
    
    		$string = strtr( $string, $chars );
    	} else {
    		$chars = array();
    		// Assume ISO-8859-1 if not UTF-8
    		$chars['in'] = 	  "\x80\x83\x8a\x8e\x9a\x9e"
    						. "\x9f\xa2\xa5\xb5\xc0\xc1\xc2"
    						. "\xc3\xc4\xc5\xc7\xc8\xc9\xca"
    						. "\xcb\xcc\xcd\xce\xcf\xd1\xd2"
    						. "\xd3\xd4\xd5\xd6\xd8\xd9\xda"
    						. "\xdb\xdc\xdd\xe0\xe1\xe2\xe3"
    						. "\xe4\xe5\xe7\xe8\xe9\xea\xeb"
    						. "\xec\xed\xee\xef\xf1\xf2\xf3"
    						. "\xf4\xf5\xf6\xf8\xf9\xfa\xfb"
    						. "\xfc\xfd\xff";
    
    		$chars['out'] = 'EfSZszYcYuAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy';
    
    		$string              = strtr( $string, $chars['in'], $chars['out'] );
    		$double_chars        = array();
    		$double_chars['in']  = array( "\x8c", "\x9c", "\xc6", "\xd0", "\xde", "\xdf", "\xe6", "\xf0", "\xfe" );
    		$double_chars['out'] = array( 'OE', 'oe', 'AE', 'DH', 'TH', 'ss', 'ae', 'dh', 'th' );
    		$string              = str_replace( $double_chars['in'], $double_chars['out'], $string );
    	}
    
    	return $string;
    }
    
    add_filter ('sanitize_user', 'se_dk_sanitize_user', 10, 3);
    
    		function se_dk_sanitize_user( $username, $raw_username, $strict = false ) {
    
    			if( $username == $raw_username ) return $username;
    			
    			include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
    			
    			// Verify if WP User Manager and/or Ultimate Member are active and configured for user_id permalinks
    			if ( $wpum = is_plugin_active( 'wp-user-manager/wp-user-manager.php' ) ) {
    				if( $wpum_permalink = get_option( 'wpum_permalink' )) {
    					if( $wpum_permalink != 'user_id' ) return $username;
    				} else return $username;
    			}
    			if ( $um = is_plugin_active( 'ultimate-member/ultimate-member.php' ) ) {
    				if( $um_options = get_option( 'um_options' )) {
    					$um_options = unserialise( $um_options );
    					if( !$um_options || $um_options['permalink_base'] != 'user_id' ) return $username;
    				} else return $username;
    			}
    			if( !$wpum && !$um ) return $username;
    			
    			$username = wp_strip_all_tags ( $raw_username );    
    			$username = se_dk_remove_accents( $username );
    			// Kill octets
    			$username = preg_replace( '|%([a-fA-F0-9][a-fA-F0-9])|', '', $username );
    			// Kill entities
    			$username = preg_replace( '/&.+?;/', '', $username ); 
    
    			// If strict, reduce to ASCII for max portability but save the SE/DK characters
    			if ( $strict ) {
    				$username = preg_replace( '/[^;\sa-zA-Z0-9 _.\-@\p{Latin}]+/u', '', $username );
    						 // preg_replace( '|[^a-z0-9 _.\-@]|i',
    			}
    
    			$username = trim( $username );
    			// Consolidate contiguous whitespace
    			$username = preg_replace( '|\s+|', ' ', $username );
    
    			return $username;
    		}

    Hello again,
    Thank you so much for sending me the code!
    Tried it but get some php errors when trying to register userwithå (removed personal weblinks in error msg):

    Fatal error: Uncaught Error: Call to undefined function unserialise() in /childtheme/functions.php:426 Stack trace: #0 /wp-includes/class-wp-hook.php(288): se_dk_sanitize_user(’userwitha’, ’userwith\xC3\xA5′, false) #1 /wp-includes/plugin.php(206): WP_Hook->apply_filters(‘userwitha’, Array) #2 /wp-includes/formatting.php(2116): apply_filters(‘sanitize_user’, ’userwitha’, ’userwith\xC3\xA5′, false) #3 /wp-content/plugins/ultimate-member/includes/core/um-actions-form.php(674): sanitize_user(’userwitha’) #4 /wp-includes/class-wp-hook.php(288): um_submit_form_errors_hook_(Array) #5 /wp-includes/class-wp-hook.php(312): WP_Hook->apply_filters(”, Array) #6 /webadress/httpd in /wp-content/themes/childtheme/functions.php on line 426

    Do you think this is a quick fix? Or am I doomed to use usernames without åäö?

    My mistake change unserialise to unserialize ie s to z
    This is the code testing if you have numeric userids in UM

    Ok, Thank you again!
    Now it says:
    Warning: unserialize() expects parameter 1 to be string, array given in wp-content/themes/childtheme/functions.php on line 426

    And the warning appears that I have unvalid characters in my username..

    I have to install UM and have a look at the parameter.

    Update last part of the code with this:

    add_filter ('sanitize_user', 'se_dk_sanitize_user', 10, 3);
    
    		function se_dk_sanitize_user( $username, $raw_username, $strict = false ) {
    
    			if( $username == $raw_username ) return $username;
    			
    			include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
    			
    			// Verify if WP User Manager and/or Ultimate Member are active and configured for user_id permalinks
    			if ( $wpum = is_plugin_active( 'wp-user-manager/wp-user-manager.php' ) ) {
    				if( $wpum_permalink = get_option( 'wpum_permalink' )) {
    					if( $wpum_permalink != 'user_id' ) return $username;
    				} else return $username;
    			}
    			if ( $um = is_plugin_active( 'ultimate-member/ultimate-member.php' ) ) {
    				if( UM()->options()->get( 'permalink_base' ) != 'user_id' ) return $username;
    			}
    			if( !$wpum && !$um ) return $username;
    			
    			$username = wp_strip_all_tags ( $raw_username );    
    			$username = se_dk_remove_accents( $username );
    			// Kill octets
    			$username = preg_replace( '|%([a-fA-F0-9][a-fA-F0-9])|', '', $username );
    			// Kill entities
    			$username = preg_replace( '/&.+?;/', '', $username ); 
    
    			// If strict, reduce to ASCII for max portability but save the SE/DK characters
    			if ( $strict ) {
    				$username = preg_replace( '/[^;\sa-zA-Z0-9 _.\-@\p{Latin}]+/u', '', $username );
    						 // preg_replace( '|[^a-z0-9 _.\-@]|i',
    			}
    
    			$username = trim( $username );
    			// Consolidate contiguous whitespace
    			$username = preg_replace( '|\s+|', ' ', $username );
    
    			return $username;
    		}

    Hello again!
    No php error messages anymore. Sadly I still get the form-error message “invalid characters in username” when I try to register with åäö.
    Anyway I’m really impressed that you took the time to try to help me with this really annoying issue!

    Do you have UserID set here for Profile permalink base?

    https://docs.ultimatemember.com/article/39-users-tab

    Yes! Also no limit of max characters in the field user_id..

Viewing 15 replies - 1 through 15 (of 16 total)
  • The topic ‘Allow åäö/ÅÄÖ’ is closed to new replies.