wplang.ru wordpress WP Lang

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

Проблема дублирования 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 и предотвращения дубликатовУдобство, готовые решенияМогут конфликтовать с мультиязычностью, дополнительные расходы
×
-15%
на премиум-тему
Bono

Создай магазин мечты
на WordPress!

↓ ↓ ↓ ↓ ↓
Купить со скидкой »