Проблема: 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' );Проверка результата после внедрения
- Создайте новый пост с заголовком, например, «Пример записи».
- Опубликуйте пост и запишите URL (например,
/primer-zapisi/). - Отредактируйте заголовок на «Обновлённый пример записи» и сохраните.
- Проверьте, что URL изменился на
/obnovlennyj-primer-zapisi/. - Если 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-функции | Плагины могут быть тяжёлыми, не всегда гибкие |