В WordPress по умолчанию URL (слаг) записи создаётся при первом сохранении поста на основе заголовка. Однако при дальнейшем изменении заголовка URL не меняется автоматически. Это может привести к несоответствию адреса и названия, что негативно влияет на SEO и удобство пользователей. В этой статье мы подробно разберём, как реализовать автоматическое обновление слагов постов при изменении заголовка без потери SEO и с учётом всех нюансов.
Почему важно обновлять URL постов при изменении заголовка
Когда заголовок меняется, а URL остаётся старым, возникают следующие проблемы:
- Адрес становится менее релевантным содержимому страницы.
- Пользователи и поисковые системы могут запутаться из-за несоответствия.
- Если вы хотите поддерживать чёткую структуру URL для удобства SEO, нужно синхронизировать их.
Но просто менять URL автоматически нельзя бездумно, т.к. может потеряться трафик с уже проиндексированных страниц и возникнут ошибки 404. Поэтому решение должно быть продуманным.
Основные подходы и ограничения
Есть несколько вариантов:
- Оставить URL неизменным — самый безопасный, но не всегда удобный.
- Менять URL и ставить 301 редирект с прошлого адреса на новый — оптимальный SEO-подход.
- Менять URL без редиректа — приведёт к потерям трафика и ошибкам.
В этой статье мы реализуем вариант с автоматическим обновлением URL и созданием 301 редиректа со старого адреса.
Реализация: автоматическое обновление слага и редирект старого URL
Для решения задачи создадим функцию с префиксом wpgenerate_. Она будет срабатывать при сохранении поста, проверять изменение заголовка, обновлять слаг и сохранять старый URL для редиректа.
1. Отслеживание сохранения поста
Используем хук save_post, который вызывается при сохранении записи.
2. Проверка изменения заголовка
Для сравнения старого и нового заголовков получим предыдущие данные из базы.
3. Обновление слага и добавление редиректа
Обновим поле post_name в базе, и создадим редирект с помощью плагина Redirection или собственного решения.
Пример кода для автоматического обновления URL с редиректом
function wpgenerate_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->post_type !== 'post') return; // Ограничиваемся типом 'post'
// Получаем старые данные поста
$old_post = get_post($post_id);
// Сравниваем заголовки
$old_title = get_post_field('post_title', $post_id, 'db');
$new_title = $post->post_title;
// Если заголовок не изменился, ничего не делаем
if ($old_title === $new_title) return;
// Генерируем новый слаг
$new_slug = sanitize_title($new_title);
// Если новый слаг совпадает с текущим, тоже ничего не делаем
if ($new_slug === $post->post_name) return;
global $wpdb;
// Сохраняем старый URL для редиректа
$old_slug = $post->post_name;
$old_url = home_url('/' . $old_slug . '/');
$new_url = home_url('/' . $new_slug . '/');
// Обновляем слаг в базе
$wpdb->update(
$wpdb->posts,
['post_name' => $new_slug],
['ID' => $post_id]
);
clean_post_cache($post_id);
// Добавляем 301 редирект
// Для этого можно использовать плагин Redirection (https://wpshop.ru/plugins/redirection/?utm_source=wpgenerate.ru&utm_medium=article&utm_campaign=kak-avtomaticheski-izmenyat-url-postov-wordpress-pri-izmenenii-zagolovka) или реализовать самостоятельно
// Пример добавления редиректа через запись в .htaccess (требует прав на запись)
$redirect_rule = "Redirect 301 /$old_slug/ $new_url";
$htaccess = ABSPATH . '.htaccess';
if (is_writable($htaccess)) {
$current = file_get_contents($htaccess);
if (strpos($current, $redirect_rule) === false) {
file_put_contents($htaccess, "\n" . $redirect_rule, FILE_APPEND);
}
}
}
add_action('save_post', 'wpgenerate_update_post_slug_on_title_change');
Работа с плагином Redirection для управления редиректами
Если вы используете плагин Redirection, то можете добавить редиректы программно через его API, что является более надежным и безопасным способом, чем правка .htaccess вручную.
Пример добавления редиректа через API Redirection
function wpgenerate_add_redirection($old_path, $new_url) {
if (!class_exists('Red_Item')) return;
$item = new Red_Item();
$item->set_source($old_path);
$item->set_target($new_url);
$item->set_enabled(true);
$item->save();
}
Вызовите эту функцию из wpgenerate_update_post_slug_on_title_change, передав старый путь и новый URL.
Советы и рекомендации
- Перед внедрением обязательно протестируйте на тестовом сайте.
- Если на сайте много постов, обновление слагов может вызвать нагрузку — применяйте с осторожностью.
- Храните резервные копии базы данных на случай ошибок.
- Если используете кэширование, после изменения URL чистите кэш.
- Для сложных сайтов с кастомными типами записей и иерархией URL дополните код с учётом специфики.
Заключение
Автоматическое обновление URL постов при изменении заголовка — полезная функция для поддержания актуальности адресов и улучшения SEO. Благодаря приведённому примеру кода и рекомендациям вы сможете реализовать это на своём сайте WordPress, сохранив переходы с прошлых URL и избежав потерь трафика.