Проблема дублирования SKU в WooCommerce при мультиязычной настройке
При работе с WooCommerce на мультиязычных сайтах часто возникает ситуация, когда один и тот же артикул (SKU) используется для разных языковых версий товара. Это вызывает ошибки при импорте, синхронизации, а также приводит к неправильной работе фильтров и аналитики.
Почему возникает дублирование SKU?
- Использование одинакового SKU для разных языков без учета префикса или суффикса.
- Плагины мультиязычности создают копии товаров как отдельные записи, не изменяя SKU.
- Импорт товаров без проверки уникальности SKU.
Диагностика проблемы: как проверить наличие дублирующихся SKU
Для диагностики можно использовать SQL-запрос или плагины для управления товарами.
SELECT meta_value AS sku, COUNT(*) AS count FROM wp_postmeta WHERE meta_key = '_sku' GROUP BY meta_value HAVING count > 1;Если запрос возвращает строки, значит SKU дублируются.
Альтернативно, можно использовать плагин SKU Checker для визуального анализа.
Пошаговое решение: добавление уникальных префиксов к SKU в зависимости от языка
Чтобы избежать конфликта, добавим префикс к SKU, например, 'en-' для английского, 'ru-' для русского и т.д. Это позволит сохранить уникальность и связать SKU с языком.
Шаг 1. Подключаемся к хуку сохранения товара
add_action('save_post_product', 'wplang_fix_duplicate_sku', 20, 1);
function wplang_fix_duplicate_sku($post_id) {
// Проверяем, что это не автосохранение
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return;
}
// Получаем объект товара
$product = wc_get_product($post_id);
if (!$product) {
return;
}
// Получаем текущий язык сайта, например, через WPML
if (function_exists('icl_object_id')) {
$lang = apply_filters('wpml_current_language', NULL);
} else {
$lang = 'default';
}
// Получаем текущий SKU
$sku = $product->get_sku();
if (!$sku) {
return;
}
// Проверяем, начинается ли SKU уже с префикса языка
if (strpos($sku, $lang . '-') === 0) {
return; // Уже исправлено
}
// Формируем новый SKU с префиксом
$new_sku = $lang . '-' . $sku;
// Проверяем уникальность нового SKU
global $wpdb;
$exists = $wpdb->get_var($wpdb->prepare(
"SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key='_sku' AND meta_value=%s AND post_id != %d",
$new_sku, $post_id
));
if ($exists) {
// Вариант решения при конфликте - добавляем уникальный суффикс
$new_sku .= '-' . wp_generate_password(4, false, false);
}
// Обновляем SKU
update_post_meta($post_id, '_sku', $new_sku);
}Шаг 2. Тестируем на нескольких товарах
Создайте или обновите товары для разных языков и проверьте, что SKU изменился с префиксом языка.
Как проверить, что решение сработало
- В админке WooCommerce в списке товаров проверьте столбец SKU — должны быть уникальные значения с префиксами языков.
- Запустите SQL-запрос диагностики повторно, чтобы убедиться, что дубли отсутствуют.
- Протестируйте импорт/экспорт товаров — ошибки с дублированием SKU не должны появляться.
Частые ошибки и их исправление
- SKU не меняются после сохранения товара: Проверьте приоритет хука, возможно, другие плагины перезаписывают SKU с более высоким приоритетом.
- Появляются слишком длинные SKU с множеством суффиксов: Убедитесь, что функция добавления суффикса вызывается только при реальном конфликте.
- Конфликт с другими плагинами мультиязычности: Проверьте, какие функции отвечают за копирование товаров и их метаданных, чтобы интегрировать исправление корректно.
Практические советы по безопасности и производительности
- Используйте кеширование запросов для проверки уникальности SKU, чтобы снизить нагрузку на базу.
- Регулярно анализируйте SKU через SQL-запросы для предотвращения новых дубликатов.
- Храните логи изменений SKU для отката в случае ошибок.
- При большом количестве товаров рассмотрите пакетное обновление SKU через WP-CLI или SQL-запросы с проверкой уникальности.
Сравнение подходов к решению проблемы дублирования SKU
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Исправление SKU через хук сохранения | Автоматическое добавление языкового префикса при сохранении товара | Автоматизация, минимальное вмешательство, сохраняет уникальность | Требует тестирования с другими плагинами, возможны конфликты |
| Ручное исправление SKU | Администратор вручную меняет SKU при создании и переводе товара | Простой контроль, нет кода | Трудозатратно, риск ошибки, не масштабируется |
| Использование плагинов SKU-менеджеров | Плагины для управления SKU и предотвращения дубликатов | Удобство, готовые решения | Могут конфликтовать с мультиязычностью, дополнительные расходы |