WordPress: автоматическое изменение URL постов при изменении заголовка

Проблема: URL поста не меняется после редактирования заголовка

В WordPress при создании записи автоматически генерируется постоянная ссылка (slug) на основе заголовка. Однако при последующем изменении заголовка URL не обновляется автоматически. Это может привести к несоответствию между названием и ссылкой, что плохо для SEO и удобства пользователя.

Почему важно обновлять URL при изменении заголовка

  • Улучшение SEO за счёт релевантного URL
  • Повышение удобства навигации
  • Избежание путаницы при расшаривании ссылок

Диагностика проблемы

Проверьте, меняется ли поле «Ярлык» (slug) вручную при редактировании поста. По умолчанию WordPress не обновляет slug автоматически после сохранения поста. Если slug остаётся старым, значит требуется дополнительное решение.

Пошаговое решение: автоматическое обновление URL при изменении заголовка

Для автоматического обновления slug при сохранении записи можно использовать хук save_post. Представленный ниже код проверяет, изменился ли заголовок, и обновляет slug соответственно.

function wpdemo_update_post_slug_on_title_change( $post_id ) {
    // Проверяем, не автосохранение ли это
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
        return;
    }

    // Проверяем права пользователя
    if ( ! current_user_can( 'edit_post', $post_id ) ) {
        return;
    }

    $post = get_post( $post_id );
    if ( $post->post_type !== 'post' ) {
        return; // Ограничиваем только для записей
    }

    // Получаем текущий slug и заголовок
    $current_slug = $post->post_name;
    $new_slug = sanitize_title( $post->post_title );

    // Обновляем slug если он не совпадает с заголовком
    if ( $current_slug !== $new_slug && ! empty( $new_slug ) ) {
        // Проверяем уникальность slug
        $unique_slug = wp_unique_post_slug( $new_slug, $post_id, $post->post_status, $post->post_type, $post->post_parent );

        // Обновляем запись с новым slug
        wp_update_post( array(
            'ID' => $post_id,
            'post_name' => $unique_slug
        ) );
    }
}
add_action( 'save_post', 'wpdemo_update_post_slug_on_title_change' );

Проверка результата после внедрения

  1. Создайте новый пост с заголовком, например, «Пример записи».
  2. Опубликуйте пост и запишите URL (например, /primer-zapisi/).
  3. Отредактируйте заголовок на «Обновлённый пример записи» и сохраните.
  4. Проверьте, что URL изменился на /obnovlennyj-primer-zapisi/.
  5. Если URL не изменился — проверьте, включён ли код и нет ли ошибок в логах.

Частые ошибки и как их исправить

  • Двойное обновление поста: Вызов wp_update_post внутри save_post может привести к рекурсии. В коде выше это не происходит, так как проверяется изменение slug.
  • Отсутствие проверки прав: Не вызывайте обновление, если пользователь не имеет прав. Это может вызвать ошибки.
  • Автосохранение: Не выполняйте логику при автосохранении, чтобы избежать лишних запросов.
  • Проблемы с уникальностью slug: Используйте wp_unique_post_slug для предотвращения конфликтов.

Практические советы по безопасности и производительности

  • Обязательно проверяйте права пользователя через current_user_can перед обновлением записи.
  • Избегайте выполнения кода при автосохранении (DOING_AUTOSAVE).
  • Используйте стандартные функции WordPress для создания безопасных и уникальных URL.
  • Не вызывайте тяжелые операции внутри хуков сохранения поста, чтобы не замедлить админку.

Сравнение вариантов реализации

СпособОписаниеПлюсыМинусы
Ручное редактирование slugПользователь меняет URL вручную при редактировании постаПолный контроль, ничего не ломаетсяЗабывают менять, не автоматизировано
Автоматическое обновление через хук save_postКод обновляет slug, если заголовок изменилсяАвтоматизация, всегда актуальный URLНужно аккуратно реализовать, чтобы избежать рекурсии
Использование плагинов SEOНекоторые SEO-плагины предлагают опции обновления URLПростая настройка, дополнительные SEO-функцииПлагины могут быть тяжёлыми, не всегда гибкие
Автоматическое отключение неиспользуемых плагинов WordPress
02.07.2026
WooCommerce: автоматическое добавление товара в корзину при открытии страницы
20.05.2026
Как создать динамический шорткод в WordPress с примерами кода
20.11.2025
WooCommerce: автоматическое удаление просроченных заказов
30.05.2026
Как добавить поддержку нескольких языков в WordPress своими силами
09.03.2026