Как изменить slug пользователя в WordPress без плагинов

Что такое slug пользователя и зачем его менять

В WordPress slug пользователя — это часть URL, которая обычно используется для профиля пользователя, например site.ru/author/username. По умолчанию slug формируется из логина пользователя, что может быть неудобно или небезопасно, особенно если логин совпадает с реальным именем или содержит личные данные.

Изменение slug пользователя помогает скрыть или кастомизировать URL профиля, улучшить SEO и повысить безопасность сайта, сделав URL менее предсказуемым для злоумышленников.

К сожалению, в стандартном функционале WordPress нет простой возможности изменить slug пользователя через админку, и многие идут путем установки плагинов. Но их можно избежать, реализовав собственный код, который корректно меняет slug и сохраняет совместимость с системой.

Как работает URL slug пользователя в WordPress

По умолчанию WordPress использует для URL профиля автора базовый префикс author и логин пользователя. Например, если логин пользователя ivan, URL будет site.ru/author/ivan. Этот URL генерируется системой rewrite rules и функцией get_author_posts_url().

Чтобы изменить slug пользователя, нужно изменить то, как формируется URL автора, и добавить новые правила перезаписи (rewrite rules), чтобы WordPress понимал новые URL.

Изменение slug пользователя: создание своей функции wphide_change_user_slug

Давайте напишем функцию, которая позволит менять slug пользователя на основе пользовательского мета-поля custom_slug. Если поле заполнено, то именно оно будет использоваться в URL.

function wphide_change_user_slug( $author_link, $author_id, $author_nicename ) {
    $custom_slug = get_user_meta( $author_id, 'custom_slug', true );
    if ( ! empty( $custom_slug ) ) {
        $author_link = str_replace( $author_nicename, $custom_slug, $author_link );
    }
    return $author_link;
}
add_filter( 'author_link', 'wphide_change_user_slug', 10, 3 );

Этот код заменяет никнейм пользователя в ссылке на значение из мета-поля custom_slug. Если поле не указано, ссылка не меняется.

Добавление правил перезаписи для новых slug пользователей

Чтобы WordPress корректно распознавал новые URL авторов с кастомными slug, нужно добавить правила перезаписи, которые будут искать пользователя по новому slug.

function wphide_add_rewrite_rules() {
    add_rewrite_tag( '%custom_author%', '([^/]+)', 'custom_author=' );
    add_rewrite_rule(
        '^author/([^/]+)/?$',
        'index.php?custom_author=$matches[1]',
        'top'
    );
}
add_action( 'init', 'wphide_add_rewrite_rules' );

Правило перезаписи говорит системе, что при заходе на URL author/любой_слуг должна устанавливаться переменная запроса custom_author.

Преобразование custom_author в ID пользователя

Теперь нужно преобразовать значение custom_author (slug из URL) в ID пользователя, чтобы WordPress мог подгрузить нужного автора. Для этого используем фильтр запроса:

function wphide_parse_custom_author_query( $query ) {
    if ( ! $query->is_main_query() ) {
        return;
    }
    $custom_author = $query->get( 'custom_author' );
    if ( $custom_author ) {
        // Поиск пользователя с заданным custom_slug
        $user_query = new WP_User_Query( array(
            'meta_key' => 'custom_slug',
            'meta_value' => $custom_author,
            'number' => 1
        ) );
        $users = $user_query->get_results();
        if ( ! empty( $users ) ) {
            $user = $users[0];
            $query->set( 'author', $user->ID );
            $query->set( 'custom_author', '' );
            $query->is_author = true;
        } else {
            // Если пользователь с таким slug не найден, 404
            $query->set_404();
        }
    }
}
add_action( 'pre_get_posts', 'wphide_parse_custom_author_query' );

Этот код перехватывает запрос, проверяет наличие параметра custom_author и заменяет его на ID пользователя с соответствующим мета-значением. Если пользователь не найден — отдаёт 404.

Как добавить и изменить custom_slug для пользователя

Чтобы работать с новым slug, его нужно сохранить в мета-поле пользователя. Для этого можно использовать стандартную страницу редактирования профиля в админке, добавив туда поле:

function wphide_show_custom_slug_field( $user ) {
    ?>
    <h3>Настройка кастомного slug</h3>
    <table class="form-table">
        <tr>
            <th><label for="custom_slug">Custom Slug</label></th>
            <td><input type="text" name="custom_slug" id="custom_slug" value="<?php echo esc_attr( get_user_meta( $user->ID, 'custom_slug', true ) ); ?>" class="regular-text" /></td>
        </tr>
    </table>
    <?php
}
add_action( 'show_user_profile', 'wphide_show_custom_slug_field' );
add_action( 'edit_user_profile', 'wphide_show_custom_slug_field' );

function wphide_save_custom_slug_field( $user_id ) {
    if ( ! current_user_can( 'edit_user', $user_id ) ) {
        return false;
    }
    if ( isset( $_POST['custom_slug'] ) ) {
        update_user_meta( $user_id, 'custom_slug', sanitize_text_field( $_POST['custom_slug'] ) );
    }
}
add_action( 'personal_options_update', 'wphide_save_custom_slug_field' );
add_action( 'edit_user_profile_update', 'wphide_save_custom_slug_field' );

Теперь при редактировании пользователя можно указать любой slug, который будет использоваться в URL профиля.

Перегенерация правил и очистка кэша перезаписи

После добавления новых правил перезаписи нужно обновить их, зайдя в админку WordPress в раздел Настройки > Постоянные ссылки и нажав кнопку «Сохранить изменения» без изменений. Это обновит правила в базе и позволит новым URL работать корректно.

Проверка и рекомендации по безопасности

При изменении slug пользователей важно убедиться, что новые значения не конфликтуют с системными URL и не содержат опасных символов. Рекомендуется валидировать slug и ограничивать набор допустимых символов, например, разрешать только буквы, цифры и дефисы.

Также стоит убедиться, что пользователь с определённым slug действительно существует, чтобы не создавать 404 ошибки для посетителей.

Краткий итог и преимущества метода

Мы реализовали механизм изменения slug пользователя в WordPress без установки плагинов, используя только функции и хуки ядра. Такой подход снижает нагрузку на сайт, уменьшает риски безопасности и даёт полный контроль над URL.

Можно легко интегрировать этот код в собственную тему или плагин и адаптировать под разные задачи, например, динамическое формирование slug или массовое обновление.

Дополнительные инструменты для оптимизации и безопасности

Для удобства работы с пользователями и оптимизации сайта можно использовать плагины от WPShop, например, Clearfy Pro, который помогает оптимизировать работу WordPress и повысить безопасность, или WPRemark для управления комментариями и пользователями.

Эти инструменты дополнят нашу кастомную реализацию и сделают сайт более защищённым и удобным для администрирования.

⭐⭐⭐⭐⭐