Смена slug категории в WooCommerce часто выглядит безобидно: поменяли название раздела, обновили ЧПУ, а через пару часов часть карточек товара начинает отдавать 404. Обычно проблема всплывает не сразу, потому что старые ссылки еще живут в кэше, а потом ломаются хлебные крошки, внутренние переходы и часть органического трафика.
Ниже разберем практический сценарий: что именно ломается после изменения slug категории, как быстро диагностировать источник 404 и как восстановить рабочие адреса без лишних костылей.
Почему после смены slug категории появляются 404
В WooCommerce URL товара может зависеть от структуры постоянных ссылок. Если в настройках включен путь с категорией, например /product-category/ или собственный шаблон с вложенной категорией, то при смене slug меняется и конечный адрес карточки. Старый URL перестает совпадать с новым маршрутом, а WordPress не всегда может корректно подобрать замену сам.
Типичный пример: категория /catalog/phones/ становится /catalog/smartphones/. Если товар был доступен по адресу /catalog/phones/iphone-15/, старый путь уже не существует. Для поисковика это новый URL, а для пользователя — ошибка 404.
Диагностика проблемы перед правкой
Сначала нужно понять, где именно ломается маршрут: в самих товарах, в правилах перезаписи или в кеше. Не стоит сразу массово ставить редиректы, пока не проверены базовые вещи.
Что проверить в админке и на сайте
- Откройте несколько проблемных товаров в браузере в режиме инкогнито.
- Сравните старый и новый URL карточки товара.
- Проверьте, не включен ли плагин кеширования, который отдает старую версию страницы.
- Зайдите в Настройки → Постоянные ссылки и просто нажмите Сохранить изменения без правок — это сбрасывает правила перезаписи.
- Убедитесь, что в WooCommerce не изменялась структура ссылок на товары и категории одновременно.
Если после сброса постоянных ссылок часть URL оживает, значит проблема была в rewrite rules. Если 404 сохраняется только на старых адресах, нужен редирект со старого slug на новый.
Быстрая проверка через серверный ответ
Проверяйте не только визуально, но и по HTTP-статусу. Например, через curl:
curl -I https://example.com/catalog/phones/iphone-15/Если в ответе видите 404 Not Found, а новый адрес открывается нормально, значит нужно либо восстановить старый маршрут, либо настроить 301-редирект.
Рабочие варианты решения
Есть три нормальных подхода: сбросить правила перезаписи, сделать редирект или убрать зависимость товара от категории в URL. Выбор зависит от того, насколько важен старый адрес и сколько страниц уже проиндексировано.
| Подход | Когда использовать | Плюсы | Минусы |
|---|---|---|---|
| Сброс постоянных ссылок | После изменения slug и массовых 404 на новых маршрутах | Быстро, без кода | Не решает проблему старых ссылок |
| 301-редирект со старого slug | Если старые URL уже в индексе или в рассылках | Сохраняет трафик и поведенческие сигналы | Нужно поддерживать правила редиректа |
| Изменение структуры ссылок товара | Если категория в URL не критична | Снижает риск будущих поломок | Может потребовать переоценки SEO-структуры |
Вариант 1: сбросить правила перезаписи
Если после смены slug новые URL тоже отдают 404, сначала обновите правила перезаписи. Иногда этого достаточно, особенно если изменения делались вручную или через импорт.
add_action('init', function () {
flush_rewrite_rules(false);
});Так делать постоянно нельзя: этот код не должен жить на сайте как постоянное решение. Используйте его только временно, например в одноразовом скрипте или при активации плагина. После выполнения код нужно убрать, иначе сайт будет лишний раз пересобирать правила.
Вариант 2: настроить 301-редирект со старого slug
Если старый адрес уже успел попасть в поисковую выдачу, лучше не терять его. Самый безопасный путь — 301-редирект на новый URL. Для точечных случаев можно добавить правило в .htaccess или настроить его через сервер, но если нужно сделать это на уровне WordPress, подойдет фильтр template_redirect.
add_action('template_redirect', function () {
if (!is_singular('product')) {
return;
}
$request_uri = $_SERVER['REQUEST_URI'] ?? '';
if (strpos($request_uri, '/catalog/phones/') !== false) {
$new_url = str_replace('/catalog/phones/', '/catalog/smartphones/', home_url($request_uri));
wp_redirect($new_url, 301);
exit;
}
});Это пример для конкретного старого префикса. В реальном проекте лучше хранить карту редиректов отдельно, а не зашивать все в условные операторы. Если старых URL много, удобнее использовать серверный редирект или плагин для управления перенаправлениями.
Вариант 3: убрать категорию из URL товара
Если структура сайта часто меняется, зависимость товара от категории в URL создает лишние риски. Тогда лучше оставить короткий и стабильный адрес товара, а категорию показывать только в навигации и хлебных крошках.
В WooCommerce это настраивается через структуру постоянных ссылок. После изменения обязательно проверьте, как ведут себя:
- основная карточка товара;
- страницы категорий;
- хлебные крошки;
- внутренние ссылки из меню и блоков;
- канонические URL, если они используются SEO-плагином.
Пошаговый порядок действий на живом сайте
- Сделайте резервную копию базы и файлов.
- Проверьте, какие именно URL отдают 404: старые, новые или оба варианта.
- Сохраните постоянные ссылки в админке, чтобы сбросить rewrite rules.
- Если старые URL уже индексируются, добавьте 301-редиректы.
- Очистите кеш на уровне плагина, сервера и CDN.
- Проверьте карточки товаров вручную и через
curl -I. - Обновите внутренние ссылки в меню, блоках и статьях, если они указывают на старый slug.
Как проверить, что решение сработало
Проверка должна быть не только визуальной. Нужны три уровня контроля: статус ответа, корректный конечный URL и отсутствие цепочек редиректов.
- Старый адрес должен отдавать
301, а не302или404. - Новый адрес должен открываться с кодом
200. - В цепочке не должно быть лишних промежуточных переходов.
- Хлебные крошки и canonical должны указывать на актуальный адрес товара.
Простой способ проверить редирект:
curl -I https://example.com/catalog/phones/iphone-15/Если в заголовках есть Location: с новым URL и статус 301 Moved Permanently, редирект настроен правильно. Затем проверьте новый адрес тем же способом:
curl -I https://example.com/catalog/smartphones/iphone-15/Частые ошибки и как их исправить
Редирект сделан через 302 вместо 301
Это частая ошибка при тестировании. Временно 302 допустим, но для постоянной миграции slug нужен именно 301. Иначе поисковики могут не передать вес старой страницы новому URL.
Старый URL редиректит на главную
Такое часто происходит, если правило написано слишком грубо или не учитывает конкретный путь товара. Пользователь теряет контекст, а поисковый робот получает слабый сигнал о замене страницы. Редирект должен вести на максимально близкий новый адрес, а не на главную.
После сохранения постоянных ссылок 404 не исчезает
Причина может быть в кеше, конфликте плагинов или в том, что структура ссылок товара была изменена не до конца. В таких случаях проверьте кеш на сервере, отключите на время плагины, влияющие на URL, и повторно сохраните настройки.
Редиректы зацикливаются
Это бывает, когда старый и новый slug перепутаны местами или правило срабатывает на уже измененный URL. Проверяйте редирект на тестовом товаре и смотрите, не возникает ли второй переход сразу после первого.
Безопасность и производительность
Если редиректов много, не стоит держать их в PHP-коде темы. Это неудобно для поддержки и может замедлять обработку запросов. Для большого числа правил лучше использовать серверную конфигурацию или отдельный инструмент управления редиректами.
Также не забывайте о безопасности: не подставляйте в wp_redirect() произвольные значения из запроса без проверки. Для динамических переходов используйте только заранее известные пути или функции вроде wp_safe_redirect(), если редирект ведет на внутренний URL.
add_action('template_redirect', function () {
if (is_singular('product') && isset($_GET['old'])) {
$target = home_url('/catalog/smartphones/');
wp_safe_redirect($target, 301);
exit;
}
});Если у вас уже есть SEO-плагин или инструмент для чистки дублей и редиректов, например Clearfy Pro, проверьте, не дублирует ли он ваши правила. Два слоя редиректов часто создают лишнюю цепочку и усложняют диагностику.
Когда лучше не трогать slug вручную
Если категория уже участвует в рекламных ссылках, email-рассылках, внешних каталогах и поисковой выдаче, массовая смена slug без плана редиректов почти всегда создает больше проблем, чем решает. В таком случае безопаснее сначала собрать карту старых URL, потом подготовить редиректы и только после этого менять структуру.
Для небольшого магазина ручная правка еще допустима. Для каталога с сотнями товаров лучше сразу работать по схеме: тестовый стенд, список URL, проверка ответов сервера, затем публикация изменений на боевом сайте.