wplang.ru wordpress WP Lang

WooCommerce: как решить проблему дублирования артикулов (SKU) при мультиязычности

Диагностика проблемы с дублирующимися SKU в WooCommerce на мультиязычном сайте

Если вы ведёте магазин на WooCommerce с поддержкой нескольких языков (например, с WPML или Polylang), то может возникнуть ситуация, когда одни и те же артикулы (SKU) повторяются для переведённых товаров. Это приводит к конфликтам при импорте, экспорте, синхронизации складских остатков и может вызвать ошибки при заказах и интеграциях с CRM.

Проверьте, действительно ли SKU дублируются:

  • Перейдите в Товары > Все товары в админке WordPress;
  • Включите колонку SKU, если не отображается;
  • Отсортируйте по SKU и проверьте, повторяются ли значения среди переводов;
  • Попробуйте экспортировать товары через стандартный экспорт WooCommerce (CSV) и проверьте, есть ли повторяющиеся SKU в файле.

Если дублирование подтверждается, это значит, что переводы товаров имеют одинаковый SKU, что WooCommerce не допускает, так как SKU — уникальный идентификатор товара.

Почему SKU дублируются при мультиязычности

Основная причина — перевод товаров создаёт их копии, в которых поля SKU копируются из оригинала. При этом WooCommerce не предусматривает автоматическое изменение SKU для переведённых товаров.

Кроме того, некоторые плагины для мультиязычности (WPML, Polylang) не умеют корректно синхронизировать уникальные поля, и SKU остаётся одинаковым.

Пошаговое решение: как избежать дублирования SKU в переводах WooCommerce

1. Настройте уникальные SKU для каждого перевода вручную (рекомендуется для небольших магазинов)

В админке WordPress откройте каждый переведённый товар, измените поле SKU на уникальное значение, например, добавьте суффикс с языковым кодом:

12345-ru  // для русского языка
12345-en  // для английского языка

Это самый простой способ, но для большого каталога неудобен.

2. Автоматизируйте добавление языкового суффикса к SKU через фильтр WooCommerce

Добавьте следующий код в functions.php вашей темы или в отдельный плагин:

add_filter('woocommerce_product_get_sku', 'add_lang_suffix_to_sku', 10, 2);
add_filter('woocommerce_product_variation_get_sku', 'add_lang_suffix_to_sku', 10, 2);

function add_lang_suffix_to_sku($sku, $product) {
    if (!$sku) return $sku;
    if (function_exists('pll_get_post_language')) { // Для Polylang
        $lang = pll_get_post_language($product->get_id());
    } elseif (defined('ICL_LANGUAGE_CODE')) { // Для WPML
        $lang = ICL_LANGUAGE_CODE;
    } else {
        $lang = '';
    }
    if ($lang && strpos($sku, "-" . $lang) === false) {
        $sku .= '-' . $lang;
    }
    return $sku;
}

Этот фильтр динамически добавляет языковой суффикс к SKU при получении, не меняя реальное значение в базе. Однако учтите, что некоторые интеграции и импорты могут работать с базовым SKU, так что тестируйте.

3. Используйте уникальные SKU при создании перевода через WPML или Polylang

При создании перевода вручную изменяйте SKU или используйте хуки, чтобы автоматически корректировать SKU при копировании товара:

add_action('wpml_after_duplicate_post', 'fix_sku_after_duplicate', 10, 2);
function fix_sku_after_duplicate($master_post_id, $translation_post_id) {
    $product = wc_get_product($translation_post_id);
    if (!$product) return;
    $sku = $product->get_sku();
    $lang = apply_filters('wpml_element_language_code', null, ['element_id' => $translation_post_id]);
    if ($sku && $lang) {
        $new_sku = $sku . '-' . $lang;
        // Проверяем уникальность SKU
        if (!wc_get_product_id_by_sku($new_sku)) {
            $product->set_sku($new_sku);
            $product->save();
        }
    }
}

Этот код срабатывает после дублирования товара WPML и добавляет языковой суффикс к SKU, если он уникален.

Проверка результата

  • После применения решения откройте список товаров и убедитесь, что для каждого перевода SKU уникален;
  • Сделайте экспорт товаров в CSV — в файле не должно быть повторяющихся SKU;
  • Проверьте на тестовом заказе, что SKU корректно отображаются и нет ошибок;
  • Если используете интеграции (1С, CRM), протестируйте синхронизацию с обновлёнными SKU.

Частые ошибки и как их исправить

  • SKU не уникальны, несмотря на добавление суффикса: проверьте, что суффикс действительно добавляется, и нет конфликтов с другими товарами. Используйте функцию wc_get_product_id_by_sku() для проверки уникальности.
  • Кэширование мешает обновлению SKU: очистите кэш сайта и кэш объектов WooCommerce через WC_Cache_Helper::invalidate_cache().
  • Интеграции не принимают изменённый SKU: в этом случае рассмотрите возможность синхронизации SKU на уровне интеграции или использование отдельного поля для языка.
  • Плагин мультиязычности перезаписывает SKU: настройте исключения в плагине или используйте хуки для предотвращения перезаписи.

Практические советы по безопасности и производительности

  • Перед внесением изменений сделайте резервную копию БД.
  • Добавляйте фильтры и хуки в дочернюю тему или отдельный плагин, чтобы избежать потери при обновлении.
  • Проверяйте производительность сайта после добавления фильтров — динамическое изменение SKU может добавить нагрузку, особенно на больших каталогах.
  • Для больших магазинов лучше использовать серверные скрипты для массового обновления SKU с языковым суффиксом.

Сравнение подходов решения проблемы SKU в WooCommerce на мультиязычных сайтах

МетодОписаниеПлюсыМинусы
Ручная правка SKU Изменение SKU в переводах вручную Простота, полный контроль Неэффективно для больших магазинов
Фильтр для динамического добавления суффикса Добавление языкового кода к SKU на лету Автоматизация, не меняет базу Возможны проблемы с интеграциями и плагинами
Автоматическое изменение SKU при дублировании WPML Хук для изменения SKU сразу после создания перевода Уникальность SKU гарантирована, автоматизация Требует WPML, может не работать с другими плагинами
×
Оптимизируй свой сайт!

Скидка -15% на премиум плагин Clearfy Pro

Купить плагин сейчас ⋙