Поле 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. Все тестовые логины были в нижнем регистре, поэтому даже не догадывался, что может такое случиться (в будущем буду умнее). А на боевом сайте всплыло и как-то не красиво получилось. Но сейчас всё работает как часы, за что Вам ещё раз спасибо.
Поле user_nicename
предназначено только для использования в URL.
Для отображения стоит использовать поле display_name
(если нужно вывести имя) или user_login
(если нужно вывести именно логин).
Сейчас я уже понял, что это было не лучшее решение. Но думаю, это теперь не так важно? Или всё же стоит поменять менять, например, на user_login?
Если тема оформления подразумевает, что отображаются логины пользователей, то в некоторых случаях могут возникнуть вопросы, т.к. эти поля не всегда совпадают (в логине могут быть пробелы, точки и знак @, а в user_nicename
— нет).
Если отображаемое значение не обязано совпадать с логином пользователя — можно оставить как есть 🙂
Вот теперь я осознал весь масштаб своей ошибки. Извиняюсь за, скорее всего, глупый вопрос, но не подскажите как сделать чтобы в display_name по умолчанию отображался user_login
Если при регистрации отображается только поле логина (помимо пароля), то оно и должно попадать в display_name
.
Странно. Но у меня всё происходит несколько иначе. После регистрации у пользователя собирается, по предложенному вами решению, first_name, nickname и user_nicename. И что-то их этого по умолчанию попадает в display_name.