Поддержка BuddyPress Функция активации пользователей.

  • Добрый день!
    Использую BP 1.8.1 и WP 3.5.2. На странице регистрации пользователей убрал все дополнительные поля, пользователь вводит только user_login и user_pass. После активации учетной записи, значение user_login, «по умолчанию» копируется в user_nicename, но при этом целиком переводится в нижний регистр. Хотелось бы сохранить первоначальный вид.
    Вроде бы, пересмотрел весь код на наличие чего-нибудь типа strtolower, но ничего по делу не нашел (пользовался поиском на сайте http://phpxref.ftwr.co.uk/buddypress/nav.html?index.html ).

    Может кто знает как или где убрать перевод в нижний регистр? Или хотя бы куда смотреть?

Просмотр 8 ответов — с 1 по 8 (всего 8)
  • Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Поле user_nicename проходит через функцию sanitize_title():
    http://core.trac.wordpress.org/browser/tags/3.6.1/wp-includes/user.php#L1314

    Функция strtolower() в итоге вызывается в sanitize_title_with_dashes():
    http://core.trac.wordpress.org/browser/tags/3.6.1/wp-includes/formatting.php#L1009

    Задача, насколько я понимаю, в том, чтобы в URL страницы автора отображать тот же регистр, который использовался в логине?

    Можно воспользоваться фрагментом, который при регистрации пользователя заново воссоздаёт поле user_nicename на основе user_login с помощью упрощённого варианта sanitize_title_with_dashes():

    function sanitize_user_nicename( $nicename ) {
    	$nicename = strip_tags( $nicename );
    
    	if ( seems_utf8( $nicename ) )
    		$nicename = utf8_uri_encode( $nicename, 200 );
    
    	$nicename = preg_replace( '/&.+?;/', '', $nicename ); // kill entities
    	$nicename = str_replace( '.', '-', $nicename );
    
    	$nicename = preg_replace( '/[^%a-zA-Z0-9 _-]/', '', $nicename );
    	$nicename = preg_replace( '/\s+/', '-', $nicename );
    	$nicename = preg_replace( '|-+|', '-', $nicename );
    	$nicename = trim( $nicename, '-' );
    
    	return $nicename;
    }
    
    function regenerate_user_nicename( $user_id ) {
    	global $wpdb;
    
    	$user = get_userdata( $user_id );
    	$user_nicename = sanitize_user_nicename( $user->user_login );
    
    	$wpdb->update( $wpdb->users, compact( 'user_nicename' ), array( 'ID' => $user->ID ) );
    }
    add_action( 'user_register', 'regenerate_user_nicename' );

    Большое спасибо, заработало!
    Задача была просто навести порядок на сайте. Изначально в теме везде использовал user_nicename. Все тестовые логины были в нижнем регистре, поэтому даже не догадывался, что может такое случиться (в будущем буду умнее). А на боевом сайте всплыло и как-то не красиво получилось. Но сейчас всё работает как часы, за что Вам ещё раз спасибо.

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Поле user_nicename предназначено только для использования в URL.

    Для отображения стоит использовать поле display_name (если нужно вывести имя) или user_login (если нужно вывести именно логин).

    Сейчас я уже понял, что это было не лучшее решение. Но думаю, это теперь не так важно? Или всё же стоит поменять менять, например, на user_login?

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Если тема оформления подразумевает, что отображаются логины пользователей, то в некоторых случаях могут возникнуть вопросы, т.к. эти поля не всегда совпадают (в логине могут быть пробелы, точки и знак @, а в user_nicename — нет).

    Если отображаемое значение не обязано совпадать с логином пользователя — можно оставить как есть 🙂

    Вот теперь я осознал весь масштаб своей ошибки. Извиняюсь за, скорее всего, глупый вопрос, но не подскажите как сделать чтобы в display_name по умолчанию отображался user_login

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Если при регистрации отображается только поле логина (помимо пароля), то оно и должно попадать в display_name.

    Странно. Но у меня всё происходит несколько иначе. После регистрации у пользователя собирается, по предложенному вами решению, first_name, nickname и user_nicename. И что-то их этого по умолчанию попадает в display_name.

Просмотр 8 ответов — с 1 по 8 (всего 8)
  • Тема «Функция активации пользователей.» закрыта для новых ответов.