Диагностика проблемы с изменением URL в WooCommerce
При смене URL товаров или категорий в WooCommerce без настройки редиректов пользователи и поисковые системы получают ошибку 404. Это негативно сказывается на SEO и пользовательском опыте. Часто проблема проявляется после массового импорта товаров, переименования категорий или изменения структуры постоянных ссылок.
Типичные признаки проблемы:
- Переход по старым URL ведет на страницу 404.
- В Google Search Console появляются ошибки «Страница не найдена».
- Падение трафика и позиций в поиске после изменения URL.
Как реализовать автоматические редиректы при смене URL в WooCommerce
Почему стандартных функций WordPress недостаточно
WordPress не создает редиректы автоматически при смене URL товаров или категорий в WooCommerce. Для этого необходимо самостоятельно отслеживать изменения и программно создавать 301 редиректы с устаревших адресов.
Пошаговое решение с примером кода
Реализуем перехват события изменения слагов (slug) товаров и категорий и добавим редирект через специальную таблицу или запись в опциях.
1. Отслеживание изменений слага товара
add_action('post_updated', function($post_ID, $post_after, $post_before) {
if ($post_after->post_type !== 'product') return;
$old_slug = $post_before->post_name;
$new_slug = $post_after->post_name;
if ($old_slug !== $new_slug) {
$old_url = home_url('/product/' . $old_slug . '/');
$new_url = home_url('/product/' . $new_slug . '/');
// Добавляем редирект в опцию (можно заменить на запись в БД)
$redirects = get_option('wc_product_redirects', []);
$redirects[$old_url] = $new_url;
update_option('wc_product_redirects', $redirects);
}
}, 10, 3);2. Отслеживание изменений слага категории (product_cat)
add_action('edited_product_cat', function($term_id, $tt_id) {
$term = get_term($term_id, 'product_cat');
$old_slug = get_term_meta($term_id, '_old_slug', true);
$new_slug = $term->slug;
if ($old_slug && $old_slug !== $new_slug) {
$old_url = get_term_link($old_slug, 'product_cat');
$new_url = get_term_link($term_id, 'product_cat');
if (!is_wp_error($old_url) && !is_wp_error($new_url)) {
$redirects = get_option('wc_category_redirects', []);
$redirects[$old_url] = $new_url;
update_option('wc_category_redirects', $redirects);
}
}
update_term_meta($term_id, '_old_slug', $new_slug);
}, 10, 2);3. Обработка редиректов на уровне front-end
add_action('template_redirect', function() {
$redirects = array_merge(
(array) get_option('wc_product_redirects', []),
(array) get_option('wc_category_redirects', [])
);
$current_url = (is_ssl() ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
if (isset($redirects[$current_url])) {
wp_redirect($redirects[$current_url], 301);
exit;
}
});Проверка результата после внедрения
- Переименуйте товар или категорию в админке WooCommerce.
- Попробуйте перейти по старому URL в браузере — должен сработать редирект на новый URL.
- Проверьте в консоли разработчика HTTP-код ответа — должен быть 301.
- В Google Search Console ошибки 404 по старым URL должны исчезать со временем.
Частые ошибки и как их исправить
- Редиректы не срабатывают: проверьте, что
template_redirectхук подключен и код не конфликтует с другими плагинами кэширования или редиректов. - Неправильные URL в редиректах: используйте
home_url()иget_term_link()для правильного формирования ссылок. - Редиректы на старый URL не добавляются: убедитесь, что слуги действительно изменились и что опции записываются корректно.
- Проблемы с производительностью: при большом количестве редиректов лучше переносить хранение в отдельную таблицу и оптимизировать поиск.
Практические советы по безопасности и производительности
- Не храните редиректы в опциях, если их много — используйте отдельную таблицу с индексами для быстрого поиска.
- Добавьте очистку устаревших редиректов при удалении товаров или категорий.
- Используйте
wp_safe_redirect(), если редиректы могут вести на внешние ресурсы. - Тестируйте редиректы на локальной среде и после установки на продакшен включите кэширование и проверьте логи ошибок.
Сравнение способов реализации редиректов при смене URL в WooCommerce
| Метод | Плюсы | Минусы |
|---|---|---|
| Плагин (например, Redirection) | Простота, интерфейс, логирование | Зависимость от плагина, лишняя нагрузка |
| Код на хуках (как в статье) | Контроль, без сторонних плагинов | Требует навыков, может нагрузить БД при большом объеме |
| Редиректы через .htaccess | Очень быстро, на уровне сервера | Сложно автоматизировать, не подходит для динамических URL |