Изменение ссылки автора с имени пользователя на никнейм

21 дек. 2010 г., 22:14:56
Просмотры: 27.6K
Голосов: 16

Привет сообществу,
возможно ли изменить стандартную ссылку с именем пользователя на никнейм, если он доступен?

По умолчанию URL выглядит так: http://domain.tld/author/(admin),
возможно ли переписать и изменить на http://domain.tld/author/(nickname), чтобы когда пользователь меняет свой никнейм в профиле, ссылка также автоматически менялась на новое имя, указанное пользователем?

Большое спасибо!
Филип

1
Комментарии

Я не думаю, что это реально возможно, так как нет query_var, который мог бы находить записи на основе никнейма пользователя, следовательно, нет подходящей переменной для сопоставления с никнеймом в правилах перезаписи. Вам придётся добавить собственную обработку query_var для работы с запросами по никнеймам вместе с любым кодом перезаписи (теоретически это возможно, но на практике это вряд ли будет элегантным решением).

t31os t31os
22 дек. 2010 г. 11:27:17
Все ответы на вопрос 3
6
18

Я вижу два способа решения этой проблемы: изменение данных, формирующих 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 );
    }
}
7 янв. 2011 г. 15:58:40
Комментарии

Хорошее решение. Я еще не проверял его, но думаю, ваш подход действительно хорош.

Anh Tran Anh Tran
7 янв. 2011 г. 17:34:36

Что насчет повторяющихся никнеймов авторов? Нужно ли нам беспокоиться об этом или WordPress сам это обрабатывает?

Drew Baker Drew Baker
23 мая 2013 г. 21:38:20

Как сказал @DrewBaker, может возникнуть проблема с дублированием URL, если у двух профилей пользователей похожие имена. Например, если пользователь 1 изменит свое имя на John и есть другой пользователь с таким же именем, то оба профиля будут иметь один и тот же URL автора: site.com/author/john.

Можете подсказать, есть ли решение для этой проблемы?

Netizen Netizen
28 дек. 2013 г. 10:14:30

Также, если в имени есть пробел, URL не будет работать. Это происходит со случайными именами пользователей, созданными этим кодом. Когда я протестировал код у себя, он генерирует случайные имена вроде "New user 654937", и URL автора выглядит как site.com/author/Newuser654937/. Этот URL не будет работать, пока мы снова не изменим имя профиля и не уберём пробелы. Можете предложить решение для этой проблемы?

Netizen Netizen
28 дек. 2013 г. 10:17:40

@IamSJ: Нет автоматической защиты от дублирования имён или недопустимых символов. Вам придётся реализовать это самостоятельно. Вероятно, проще всего сделать это вторым способом — изменив "nicename".

Jan Fabry Jan Fabry
29 дек. 2013 г. 13:43:00

Мне удаётся изменить слаги, но всё равно выдает 404 ошибку, даже после обновления постоянных ссылок. Кто-нибудь решил эту проблему?

EHerman EHerman
17 янв. 2015 г. 23:21:31
Показать остальные 1 комментариев
0

Используйте этот плагин: 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

20 нояб. 2011 г. 19:07:41
1
-3

Простой способ - это плагин 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;
}
22 дек. 2010 г. 02:08:14
Комментарии

К сожалению, пользователь хочет изменить не базу авторов.

t31os t31os
22 дек. 2010 г. 11:24:00