Изменение ссылки автора с имени пользователя на никнейм
Привет сообществу,
возможно ли изменить стандартную ссылку с именем пользователя на никнейм, если он доступен?
По умолчанию URL выглядит так: http://domain.tld/author/(admin),
возможно ли переписать и изменить на http://domain.tld/author/(nickname), чтобы когда пользователь меняет свой никнейм в профиле, ссылка также автоматически менялась на новое имя, указанное пользователем?
Большое спасибо!
Филип
Я вижу два способа решения этой проблемы: изменение данных, формирующих URL автора, или изменение самого URL автора. Вероятно, вам также следует настроить редиректы, чтобы старые URL-адреса архивов пользователей продолжали работать при изменении никнейма пользователя.
Изменение URL автора
Этот вопрос состоит из двух частей: обработка входящих ссылок с никнеймом автора вместо слага автора и генерация URL-адресов постов автора с никнеймом вместо стандартного слага.
Первая часть решается с помощью хука фильтра request, проверки, является ли запрос запросом автора, и поиска автора по никнейму вместо слага. Если мы находим автора, мы изменяем параметры запроса для использования ID автора.
add_filter( 'request', 'wpse5742_request' );
function wpse5742_request( $query_vars )
{
if ( array_key_exists( 'author_name', $query_vars ) ) {
global $wpdb;
$author_id = $wpdb->get_var( $wpdb->prepare( "SELECT user_id FROM {$wpdb->usermeta} WHERE meta_key='nickname' AND meta_value = %s", $query_vars['author_name'] ) );
if ( $author_id ) {
$query_vars['author'] = $author_id;
unset( $query_vars['author_name'] );
}
}
return $query_vars;
}
Вторая часть решается с помощью хука фильтра author_link и замены стандартной части автора (указанной как $author_nicename) на никнейм.
add_filter( 'author_link', 'wpse5742_author_link', 10, 3 );
function wpse5742_author_link( $link, $author_id, $author_nicename )
{
$author_nickname = get_user_meta( $author_id, 'nickname', true );
if ( $author_nickname ) {
$link = str_replace( $author_nicename, $author_nickname, $link );
}
return $link;
}
Изменение данных, формирующих URL автора
Возможно, более простым способом будет обновление обычно неиспользуемого поля user_nicename в базе данных. Я думаю, оно генерируется из логина пользователя и никогда не изменяется после этого. Но я не эксперт в управлении пользователями, так что используйте этот метод на свой страх и риск.
add_action( 'user_profile_update_errors', 'wpse5742_set_user_nicename_to_nickname', 10, 3 );
function wpse5742_set_user_nicename_to_nickname( &$errors, $update, &$user )
{
if ( ! empty( $user->nickname ) ) {
$user->user_nicename = sanitize_title( $user->nickname, $user->display_name );
}
}
Хорошее решение. Я еще не проверял его, но думаю, ваш подход действительно хорош.
Anh Tran
Что насчет повторяющихся никнеймов авторов? Нужно ли нам беспокоиться об этом или WordPress сам это обрабатывает?
Drew Baker
Как сказал @DrewBaker, может возникнуть проблема с дублированием URL, если у двух профилей пользователей похожие имена. Например, если пользователь 1 изменит свое имя на John и есть другой пользователь с таким же именем, то оба профиля будут иметь один и тот же URL автора: site.com/author/john.
Можете подсказать, есть ли решение для этой проблемы?
Netizen
Также, если в имени есть пробел, URL не будет работать. Это происходит со случайными именами пользователей, созданными этим кодом. Когда я протестировал код у себя, он генерирует случайные имена вроде "New user 654937", и URL автора выглядит как site.com/author/Newuser654937/. Этот URL не будет работать, пока мы снова не изменим имя профиля и не уберём пробелы. Можете предложить решение для этой проблемы?
Netizen
@IamSJ: Нет автоматической защиты от дублирования имён или недопустимых символов. Вам придётся реализовать это самостоятельно. Вероятно, проще всего сделать это вторым способом — изменив "nicename".
Jan Fabry
Используйте этот плагин: http://wordpress.org/extend/plugins/display-name-author-permalink/
Хотя он не тестировался для версии 3.2.1, я использую его без проблем.
Если при активации плагина вы получите ошибку заголовка, исправление можно найти здесь: http://wordpresscloaker.com/blog/how-to-fix-wordpress-plugin-does-not-have-a-valid-header-error.html
Простой способ - это плагин Author Slug
Также можно использовать небольшой код:
add_action('init', 'set_new_author_base');
function set_new_author_base() {
global $wp_rewrite;
$author_slug = 'new_slug'; // Установите здесь желаемый слаг для автора
$wp_rewrite->author_base = $author_slug;
}