Исправление дублирования артикулов (SKU) в WooCommerce

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

Дублирование артикулов (SKU) в WooCommerce приводит к ошибкам в учёте запасов, сбоям при экспорте данных и проблемам с интеграциями. Чаще всего проблема возникает из-за ручного ввода одинаковых значений, импорта товаров без проверки уникальности, либо из-за особенностей кастомных скриптов и плагинов.

Для диагностики выполните следующие шаги:

  • В админ-панели WooCommerce перейдите в Товары и отсортируйте список по столбцу 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

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

function fix_duplicate_skus() {
    global $wpdb;
    $duplicates = $wpdb->get_results(
        "SELECT meta_value AS sku, GROUP_CONCAT(post_id) AS product_ids, COUNT(*) AS cnt 
         FROM {$wpdb->postmeta} 
         WHERE meta_key = '_sku' 
         GROUP BY meta_value 
         HAVING cnt > 1"
    );

    foreach ($duplicates as $dup) {
        $product_ids = explode(',', $dup->product_ids);
        // Пропускаем первый товар, исправляем остальные
        array_shift($product_ids);
        $suffix = 1;
        foreach ($product_ids as $product_id) {
            $new_sku = $dup->sku . '-' . $suffix;
            // Проверяем уникальность нового SKU
            while (sku_exists($new_sku)) {
                $suffix++;
                $new_sku = $dup->sku . '-' . $suffix;
            }
            update_post_meta($product_id, '_sku', $new_sku);
            $suffix++;
        }
    }
}

// Проверка наличия SKU в базе
function sku_exists($sku) {
    global $wpdb;
    $count = $wpdb->get_var($wpdb->prepare(
        "SELECT COUNT(*) FROM {$wpdb->postmeta} WHERE meta_key = '_sku' AND meta_value = %s",
        $sku
    ));
    return $count > 0;
}

// Запуск исправления (один раз)
fix_duplicate_skus();

Рекомендуется запускать этот код в отдельном PHP-файле в корне сайта или через плагин для пользовательских сниппетов, после чего удалить, чтобы не вызывать повторное исправление.

Альтернативный способ: проверка при сохранении товара

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

add_action('save_post_product', 'validate_unique_sku', 10, 3);
function validate_unique_sku($post_id, $post, $update) {
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
    if ($post->post_type !== 'product') return;

    $sku = isset($_POST['_sku']) ? sanitize_text_field($_POST['_sku']) : '';
    if (!$sku) return;

    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",
        $sku, $post_id
    ));

    if ($exists) {
        remove_action('save_post_product', 'validate_unique_sku', 10);
        wp_die('Ошибка: артикул (SKU) должен быть уникальным. Этот SKU уже используется другим товаром.');
    }
}

Проверка результата после внедрения

Чтобы убедиться, что проблема решена, сделайте следующее:

  • В админке WooCommerce обновите список товаров и проверьте столбец SKU — дубликатов не должно быть.
  • Повторно выполните SQL-запрос из раздела диагностики — он не должен возвращать строк.
  • Попробуйте создать новый товар с уже существующим SKU — появится ошибка.
  • Протестируйте импорт товаров с дублирующимися SKU — скрипт должен выдавать предупреждения или исправлять значения.

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

  • Ошибка: Скрипт не исправляет все дубликаты.
    Причина: Кэширование или неправильное место запуска скрипта.
    Решение: Запустите скрипт через WP-CLI или временно отключите кэш.
  • Ошибка: При сохранении товара нет проверки и дубли появляются снова.
    Причина: Хук save_post_product может не срабатывать из-за конфликтов.
    Решение: Проверьте приоритет и совместимость с другими плагинами; используйте альтернативный хук woocommerce_process_product_meta.
  • Ошибка: При массовом импорте SKU не проверяются.
    Причина: Импортер не учитывает уникальность SKU.
    Решение: Используйте фильтр woocommerce_product_import_pre_insert_product_object для внедрения проверки и коррекции SKU.

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

  • Не храните SKU с пробелами и спецсимволами — используйте только латиницу, цифры и дефисы.
  • Не запускайте исправляющие скрипты на продакшене без бэкапа базы.
  • Добавьте индексы для поля _sku в таблице wp_postmeta для ускорения запросов, если товаров много.
  • Используйте транзиенты или кеширование результатов проверки уникальности при массовой обработке товаров.

Таблица сравнения методов исправления дублирования SKU

МетодПреимуществаНедостатки
Ручное исправление в админкеПросто, не требует кодаДолго при большом количестве товаров, риск пропустить дубликаты
Автоматический скрипт исправленияБыстро исправляет все дубликаты сразуТребует доступа к серверу, риск ошибок без бэкапа
Проверка при сохранении товараПредотвращает появление дубликатовНе исправляет старые ошибки
Исправление на этапе импортаАвтоматическая корректировка новых товаровЗависит от импорта, сложнее внедрять
WooCommerce: автоматическое изменение стоимости товара при изменении атрибутов
09.06.2026
Как избежать проблем с производительностью при очистке кеша WooCommerce
25.04.2026
Как правильно кэшировать данные в WordPress для ускорения сайта
31.12.2025
Как удалить пустые термины в таксономиях WordPress программно
16.12.2025
Как избежать конфликтов между плагинами в WordPress
12.02.2026