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

Диагностика проблемы с дубликатами SKU в WooCommerce

SKU (Stock Keeping Unit) — уникальный идентификатор товара. Дубликаты SKU приводят к ошибкам при управлении запасами, отчетах и интеграциях с внешними сервисами. WooCommerce не запрещает создавать товары с одинаковым SKU, что вызывает конфликты и сбои в работе магазина.

Основные симптомы проблемы:

  • Ошибки при сохранении или обновлении товара;
  • Некорректное отображение остатков на складе;
  • Неправильная работа интеграций с 1С, ERP, маркетплейсами;
  • Проблемы при генерации отчетов и экспортов.

Для диагностики можно использовать SQL-запрос, который покажет дублирующиеся SKU:

SELECT meta_value AS sku, COUNT(*) AS count FROM wp_postmeta WHERE meta_key = '_sku' GROUP BY meta_value HAVING count > 1;

Если запрос возвращает строки, значит в базе есть товары с одинаковыми SKU.

Автоматическое исправление дубликатов SKU через пользовательский код

Общая идея решения

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

Пример кода для functions.php или отдельного плагина

add_action('save_post_product', 'auto_fix_duplicate_sku', 20, 3);function auto_fix_duplicate_sku($post_id, $post, $update) {    // Проверяем тип записи    if ('product' !== $post->post_type) {        return;    }    // Получаем текущий SKU    $sku = get_post_meta($post_id, '_sku', true);    if (empty($sku)) {        return; // SKU пустой, ничего не правим    }    global $wpdb;    // Ищем дубликаты (кроме текущего товара)    $query = $wpdb->prepare(        "SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = '_sku' AND meta_value = %s AND post_id != %d",        $sku,        $post_id    );    $existing = $wpdb->get_var($query);    if (!$existing) {        return; // Дубликатов нет    }    // Генерируем уникальный SKU с суффиксом    $suffix = 1;    $new_sku = $sku . '-' . $suffix;    while ($wpdb->get_var($wpdb->prepare("SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = '_sku' AND meta_value = %s", $new_sku))) {        $suffix++;        $new_sku = $sku . '-' . $suffix;    }    // Обновляем SKU    update_post_meta($post_id, '_sku', $new_sku);}

Данный код автоматически исправит дубликат, добавив суффикс "-1", "-2" и так далее, пока не найдется уникальный SKU.

Пошаговое внедрение решения

  1. Создайте резервную копию базы данных.
  2. Добавьте приведенный код в файл functions.php вашей дочерней темы или создайте отдельный плагин.
  3. Отредактируйте любой товар с дублирующимся SKU и сохраните его.
  4. Проверьте, изменился ли SKU автоматически (суффикс добавлен).
  5. При необходимости выполните массовое обновление товаров с дублирующимися 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 и убедитесь, что к ним добавлен суффикс.

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

  • Код не срабатывает при сохранении товара: убедитесь, что хук save_post_product используется, а не save_post. Проверьте, что код подключен и нет PHP-ошибок.
  • SKU не обновляется в админке: возможно, другие плагины вмешиваются в сохранение мета-данных. Для теста отключите все сторонние плагины кроме WooCommerce.
  • Проблемы с кешем: очистите кеш сайта и браузера после внесения изменений.
  • Некорректная работа с вариациями: вариации имеют свои SKU, проверяйте их отдельно, используя тип записи product_variation.

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

  • Используйте транзакции, если делаете массовое обновление SKU через SQL.
  • Код не должен вызывать бесконечные циклы обновления. В нашем примере мы обновляем SKU только при обнаружении дубликатов, что безопасно.
  • Периодически проверяйте базу на наличие дубликатов, особенно после импорта товаров или массовых обновлений.
  • Для более сложных сценариев интегрируйте проверку уникальности SKU в процессы импорта через WP CLI или API.

Сравнение вариантов решения дубликатов SKU

МетодПлюсыМинусыКомпромисс
Ручное исправление в админкеПросто, не требует кодаТрудоемко, ошибки возможныПодходит для небольших магазинов
Плагин проверки уникальности SKUАвтоматизация, уведомленияЗависимость от сторонних решений, возможные конфликтыХорошо для магазинов со стандартными нуждами
Кастомный код для автоматического исправленияГибкость, контроль, интеграция в бизнес-процессыТребует поддержки и тестированияОптимально для крупных и кастомизированных магазинов
WooCommerce: как автоматически изменять ставку налогов по регионам без плагинов
06.07.2026
Как использовать AJAX для обновления контента в WordPress без перезагрузки страницы
26.02.2026
Как создать внешний API для WordPress с поддержкой авторизации
23.12.2025
WooCommerce: как автоматически удалять товары без запаса
26.05.2026
Как установить ограничения на сообщения в комментариях WordPress
01.02.2026