Проблема: URL товара не обновляется при изменении атрибутов
В WooCommerce часто возникает ситуация, когда при изменении атрибутов товара (например, цвета или размера) URL товара не меняется, хотя это необходимо для SEO или удобства пользователей. По умолчанию WooCommerce генерирует URL товара на основе названия товара, а вариации остаются без собственных ЧПУ (человеко-понятных URL). Это вызывает путаницу и снижает качество структуры сайта.
Диагностика проблемы
Чтобы проверить, срабатывает ли обновление URL при изменении атрибутов, выполните следующие шаги:
- Перейдите в админку WooCommerce → Товары → выберите товар с вариациями.
- Измените один из атрибутов вариации (например, цвет).
- Обновите товар и проверьте URL вариации на фронтенде.
- Если URL не изменился, значит нужно реализовать кастомное решение.
Решение: автоматическое обновление URL вариаций по атрибутам
Для создания уникального URL на основе атрибутов вариации потребуется добавить кастомный код, который будет формировать постоянную ссылку для каждой вариации. Для этого используйте хук woocommerce_variation_post_link и фильтры WordPress.
Шаг 1: Создаем функцию генерации ЧПУ с атрибутами
function custom_variation_permalink( $permalink, $variation ) {
if ( ! $variation ) {
return $permalink;
}
$product = wc_get_product( $variation->get_parent_id() );
if ( ! $product ) {
return $permalink;
}
$attributes = $variation->get_attributes();
$slug_parts = [];
foreach ( $attributes as $tax => $term_slug ) {
if ( ! empty( $term_slug ) ) {
$slug_parts[] = sanitize_title( $term_slug );
}
}
if ( empty( $slug_parts ) ) {
return $permalink;
}
$base_permalink = get_permalink( $product->get_id() );
$variation_slug = implode( '-', $slug_parts );
return trailingslashit( $base_permalink ) . $variation_slug . '/';
}Шаг 2: Подключаем фильтр для изменения URL вариации
add_filter( 'woocommerce_variation_post_link', 'custom_variation_permalink', 10, 2 );Шаг 3: Регистрируем новые правила перезаписи (rewrite rules)
Чтобы новые URL распознавались, добавьте правила перезаписи. Добавьте следующий код в файл functions.php вашей темы или в плагин:
function custom_variation_rewrite_rules() {
$products = get_posts([
'post_type' => 'product',
'numberposts' => -1,
'post_status' => 'publish'
]);
foreach ( $products as $product_post ) {
$product = wc_get_product( $product_post->ID );
if ( ! $product || ! $product->is_type( 'variable' ) ) {
continue;
}
$variations = $product->get_children();
foreach ( $variations as $variation_id ) {
$variation = wc_get_product( $variation_id );
$attributes = $variation->get_attributes();
$slug_parts = [];
foreach ( $attributes as $term_slug ) {
if ( ! empty( $term_slug ) ) {
$slug_parts[] = sanitize_title( $term_slug );
}
}
if ( empty( $slug_parts ) ) {
continue;
}
$variation_slug = implode( '-', $slug_parts );
$base_slug = get_post_field( 'post_name', $product_post->ID );
add_rewrite_rule( '^' . $base_slug . '/' . $variation_slug . '/?$', 'index.php?product_variation=' . $variation_id, 'top' );
}
}
}
add_action( 'init', 'custom_variation_rewrite_rules' );Шаг 4: Обработка запроса вариации
Добавьте обработчик запроса для корректного отображения вариации по новому URL:
function custom_variation_template_redirect() {
if ( get_query_var( 'product_variation' ) ) {
$variation_id = absint( get_query_var( 'product_variation' ) );
$variation = wc_get_product( $variation_id );
if ( $variation && $variation->is_type( 'variation' ) ) {
$parent_id = $variation->get_parent_id();
wp_redirect( get_permalink( $parent_id ) . '?variation_id=' . $variation_id );
exit;
}
}
}
add_action( 'template_redirect', 'custom_variation_template_redirect' );Шаг 5: Регистрация query var
function custom_variation_query_vars( $vars ) {
$vars[] = 'product_variation';
return $vars;
}
add_filter( 'query_vars', 'custom_variation_query_vars' );Проверка результата
После добавления кода и обновления постоянных ссылок (Перейдите в Настройки -> Постоянные ссылки и нажмите «Сохранить изменения» без правок) проверьте:
- Откройте страницу товара и посмотрите URL вариаций: они должны содержать атрибуты (например,
site.ru/product-name/red-large/). - Попробуйте перейти по URL вариации напрямую — должна открыться страница товара с выбранной вариацией.
- Проверьте, не возникает ли 404 ошибок.
Частые ошибки и причины
- 404 ошибка на вариациях после добавления кода: Не обновлены правила перезаписи. Решение — перейти в настройки постоянных ссылок и сохранить их.
- URL не меняется: Возможно, кеширование страниц или плагинов блокирует обновление. Очистите кеш, отключите плагины кеширования временно.
- Вариации не открываются корректно: Проверьте, что функция обработки запроса
template_redirectкорректно перенаправляет на страницу товара с параметром вариации. - Производительность падает: При большом количестве товаров и вариаций генерация правил перезаписи может замедлять загрузку. В этом случае рассмотрите использование плагинов с поддержкой ЧПУ вариаций.
Практические советы по производительности и безопасности
- Для сайтов с большим количеством товаров используйте плагин кэширования и минимизируйте количество кастомных правил перезаписи.
- Не храните сложные данные в URL, чтобы избежать проблем с индексацией поисковиками.
- Тестируйте изменения на тестовом стенде, прежде чем выкатывать на продакшн.
- Отключайте неиспользуемые плагины, чтобы избежать конфликтов с кастомными хуками.
Сравнение вариантов реализации URL вариаций
| Метод | Преимущества | Недостатки |
|---|---|---|
| Кастомный код | Полный контроль, гибкость, без дополнительных плагинов | Сложность реализации, потенциальные ошибки, нагрузка на перезапись URL |
| Плагины для ЧПУ вариаций (например, WooCommerce Permalink Manager) | Простота настройки, поддержка обновлений | Дополнительные расходы, возможные конфликты, ограниченная кастомизация |
| Стандартные URL вариаций | Простота, стабильность, минимальная нагрузка | Плохая SEO-оптимизация, менее удобные URL для пользователя |