Диагностика проблемы с названием и URL вариации товара в WooCommerce
По умолчанию WooCommerce не предоставляет отдельного пользовательского интерфейса для изменения названия вариаций товаров — они наследуют название основного товара с атрибутами. URL вариаций тоже формируется автоматически и содержит ID вариации, что неудобно для SEO и пользовательского восприятия. В результате возникает задача: изменить название вариации и настроить человекочитаемый URL без использования сторонних плагинов.
Пошаговое решение: изменение названия вариации товара
1. Добавление пользовательского поля для названия вариации
Чтобы задать собственное название вариации, добавим новое поле в админку вариаций:
add_action('woocommerce_variation_options_pricing', 'add_custom_variation_title_field', 10, 3);
function add_custom_variation_title_field($loop, $variation_data, $variation) {
woocommerce_wp_text_input(array(
'id' => "custom_variation_title_{$variation->ID}",
'label' => __('Custom Variation Title', 'woocommerce'),
'desc_tip' => true,
'description' => __('Введите уникальное название для вариации', 'woocommerce'),
'value' => get_post_meta($variation->ID, '_custom_variation_title', true),
));
}
2. Сохранение значения пользовательского поля
add_action('woocommerce_save_product_variation', 'save_custom_variation_title_field', 10, 2);
function save_custom_variation_title_field($variation_id, $i) {
if (isset($_POST["custom_variation_title_{$variation_id}"])) {
update_post_meta($variation_id, '_custom_variation_title', sanitize_text_field($_POST["custom_variation_title_{$variation_id}"]));
}
}
3. Отображение пользовательского названия вариации на фронтенде
Чтобы заменить стандартное отображение названия вариации на кастомное, используем фильтр:
add_filter('woocommerce_variation_option_name', 'show_custom_variation_title');
function show_custom_variation_title($term_name) {
global $product;
if (!$product || !is_product()) return $term_name;
$available_variations = $product->get_available_variations();
foreach ($available_variations as $variation) {
$custom_title = get_post_meta($variation['variation_id'], '_custom_variation_title', true);
if ($custom_title && strpos($term_name, $variation['attributes']['attribute_pa_color']) !== false) {
return $custom_title;
}
}
return $term_name;
}
Как изменить URL вариации товара на человекочитаемый
Для URL вариации по умолчанию WooCommerce использует структуру product/название-основного-товара/?attribute_pa_атрибут=значение или product/название-основного-товара/вариация-ID/. Чтобы сделать URL вариации более понятным, можно настроить канонические ссылки и перезаписать URL с помощью фильтров.
1. Добавление перезаписи URL для вариаций
Пример кода для создания человекочитаемого URL в формате product/название-основного-товара/название-вариации/:
add_filter('woocommerce_variation_is_active', 'custom_variation_slug_rewrite', 10, 2);
function custom_variation_slug_rewrite($active, $variation) {
// Здесь можно добавить кастомную логику активации вариации
return $active;
}
add_filter('post_type_link', 'custom_variation_permalink', 10, 4);
function custom_variation_permalink($permalink, $post, $leavename, $sample) {
if ($post->post_type === 'product_variation') {
$parent_id = wp_get_post_parent_id($post->ID);
$parent_slug = get_post_field('post_name', $parent_id);
$custom_title = get_post_meta($post->ID, '_custom_variation_title', true);
$variation_slug = $custom_title ? sanitize_title($custom_title) : $post->post_name;
return home_url("product/{$parent_slug}/{$variation_slug}/");
}
return $permalink;
}
2. Регистрация пользовательских правил перезаписи (rewrite rules)
add_action('init', 'add_custom_variation_rewrite_rules');
function add_custom_variation_rewrite_rules() {
add_rewrite_rule(
'^product/([^/]+)/([^/]+)/?$',
'index.php?product=$matches[1]&variation_slug=$matches[2]',
'top'
);
}
После добавления правил нужно обновить пермалинки в админке (Настройки > Постоянные ссылки).
3. Обработка запроса вариации по кастомному слагу
Создаем фильтр для определения вариации по пользовательскому слагу в URL:
add_filter('request', 'parse_custom_variation_slug');
function parse_custom_variation_slug($query_vars) {
if (isset($query_vars['variation_slug']) && isset($query_vars['product'])) {
$product = wc_get_product(wp_get_post_parent_id(get_page_by_path($query_vars['product'])));
if ($product) {
foreach ($product->get_children() as $variation_id) {
$custom_title = get_post_meta($variation_id, '_custom_variation_title', true);
$variation_slug = $custom_title ? sanitize_title($custom_title) : '';
if ($variation_slug === $query_vars['variation_slug']) {
$query_vars['product_variation'] = $variation_id;
break;
}
}
}
}
return $query_vars;
}
Проверка результата после внедрения
- Зайдите в админку товара, убедитесь, что поле «Custom Variation Title» отображается и сохраняется корректно.
- На странице товара проверьте, что вариации показывают новое название.
- Перейдите по новому URL вариации, например
site.ru/product/название-товара/название-вариации/, и убедитесь, что открывается соответствующая вариация. - Обновите постоянные ссылки, чтобы новые rewrite-правила заработали.
- Проверьте работу корзины и оформления заказа с вариациями — должны корректно добавляться товары с новыми названиями.
Частые ошибки и как их исправить
- Поле для кастомного названия не сохраняется. Проверьте наличие и правильность
woocommerce_save_product_variationхука и правильность ID поля в форме. - Новый URL вариации выдает 404. Забудьте обновить постоянные ссылки (Settings > Permalinks). Также проверьте правильность правил перезаписи и фильтров.
- Вариация не отображается на странице товара. Убедитесь, что фильтр
woocommerce_variation_option_nameкорректно возвращает название и не конфликтует с другими плагинами. - Проблемы с добавлением вариации в корзину по новому URL. Проверьте, что WooCommerce корректно получает ID вариации из запроса и не ломается функционал.
Практические советы по безопасности и производительности
- Используйте
sanitize_text_field()и другие функции очистки для пользовательских данных, чтобы избежать XSS и инъекций. - Кешируйте результаты запросов метаданных вариаций, если на сайте много товаров — это снизит нагрузку.
- Тестируйте изменения на staging-среде, чтобы не нарушить работу магазина в проде.
- Следите за совместимостью с обновлениями WooCommerce, так как внутренние хуки могут меняться.
- Если функционал усложняется, рассмотрите использование специализированных плагинов с поддержкой SEO для вариаций, например Clearfy Pro (https://wpshop.ru/plugins/clearfy?utm_source=wpdesk.ru&utm_medium=article&utm_campaign=woocommerce-kak-izmenit-nazvanie-i-url-variacii-tovara) для оптимизации URL.
Сравнение вариантов реализации изменения названия и URL вариации
| Вариант | Описание | Плюсы | Минусы |
|---|---|---|---|
| Код на functions.php | Ручное добавление полей, фильтров и rewrite-правил | Полный контроль, без плагинов | Сложность поддержки, возможность ошибок |
| Плагины SEO и оптимизации | Готовые решения для кастомизации URL и названий | Удобство, поддержка, обновления | Зависимость от стороннего кода, возможные конфликты |
| Компромисс | Частично код + плагины для SEO | Баланс контроля и удобства | Требует знаний и тестирования |