WooCommerce: как изменить URL товара после изменения атрибутов

Проблема: 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 для пользователя
Автоматизация дублирования постов в WordPress с помощью хуков
27.02.2026
Как создать обратный звонок в WordPress с помощью шорткода
07.04.2026
Решение проблем с хостингом для WooCommerce в WordPress
08.12.2025
Как создать динамическую регистрацию пользователей в WordPress с использованием REST API
12.01.2026
Как создать собственный тип записи (Custom Post Type) в WordPress: подробное руководство с примерами
29.12.2025