Измените автора Slug с имени пользователя на псевдоним

13

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

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

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

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

Ответы:

16

Я вижу два способа решения этой проблемы: изменение данных, формирующих URL автора, или изменение URL автора. Вы, вероятно, должны обрабатывать и перенаправления, поэтому старые URL-адреса в пользовательских архивах продолжают работать, когда пользователь меняет свой ник.

Изменение URL автора

Этот вопрос состоит из двух частей: обрабатывать входящие ссылки с псевдонимом автора, а не слагом автора, и генерировать URL-адреса сообщений автора с псевдонимом вместо стандартного слага.

Первая часть решается путем подключения к requestфильтру, проверки, является ли это запросом автора, и поиска автора по псевдониму вместо слаг. Если мы найдем автора, мы изменим параметры запроса, чтобы использовать идентификатор автора.

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 );
    }
}
Ян Фабри
источник
Хорошее решение. Я еще не проверил это, но я думаю, что ваш подход действительно хорош.
Ань Чан
Как насчет повторяющихся имен авторов? Нужно ли беспокоиться об этом, или WP позаботится об этом?
Дрю Бейкер
Как сказал @DrewBaker, может быть проблема с дублированными URL-адресами, если два пользовательских профиля имеют одинаковые имена. Скажем, если пользователь 1 отредактировал свое имя пользователя как Джон, и есть другой пользователь с похожим именем, оба профиля пользователя имеют один URL-адрес автора, например site.com/author/john. Можете ли вы сказать мне, если есть решение для этого?
Нетизен
Также, если между именем есть пробел, URL не будет работать. Это происходит со случайными именами пользователей, созданными с помощью этого кода. Когда я попробовал код на моем конце, он генерирует случайные имена пользователей, такие как Новый пользователь 654937, и URL автора выглядит как site.com/author/Newuser654937/. Этот URL не будет работать, пока мы снова не изменим имя профиля и не удалим пробелы. Можете ли вы предложить решение с этим?
Нетизен
@IamSJ: Автоматическая защита от повторяющихся имен или недопустимых символов отсутствует. Вы должны будете обеспечить это самостоятельно. Вероятно, проще всего, если вы сделаете это вторым способом, изменив «nicename».
Ян Фабри
1

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

Доминор Новус
источник
-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;
}
bueltge
источник
3
Это не авторская база, которую, к сожалению, хочет изменить пользователь.
t31os