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

Изменение авторского слизня с имени пользователя на псевдоним
Изменение авторского слизня с имени пользователя на псевдоним - plhnk @ Unsplash

Привет сообществу,

возможно ли изменить стандартный slug имени пользователя на никнейм, если таковой имеется?

По умолчанию url выглядит примерно так: http://domain.tld/author/(admin ) ,

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

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

Филипп

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

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

В этом вопросе есть две части: обработка входящих ссылок с ником автора вместо его slug и генерация урлов сообщений автора с ником вместо стандартного slug.

Первая часть решается подключением к фильтру request, проверкой, является ли это запрос автора, и поиском автора по нику вместо slug. Если автор найден, мы изменяем параметры запроса, чтобы использовать 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 );
    }
}

TheMakeCode, 31 мая 2023 г., 01:20