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

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

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

Чтобы диагностировать проблему, проверьте наличие повторяющихся артикулов в базе данных. Для этого можно выполнить SQL-запрос через phpMyAdmin или командную строку:

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

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

Почему дублирование SKU опасно?

  • Сбой в интеграции с внешними системами
  • Неправильное отображение товаров в учётных системах
  • Ошибки в обработке заказов
  • Проблемы с поиском и фильтрацией товаров

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

1. Добавляем проверку SKU при сохранении товара

Используем хук save_post для проверки уникальности SKU и вывода ошибки при попытке сохранить дубликат.

add_action('save_post_product', 'check_unique_sku_on_save', 10, 3);
function check_unique_sku_on_save($post_id, $post, $update) {
    // Проверяем, что это не автосохранение
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;

    // Получаем SKU из POST
    if (isset($_POST['_sku'])) {
        $sku = sanitize_text_field($_POST['_sku']);
        if (empty($sku)) return;

        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_post_id = $wpdb->get_var($query);

        if ($existing_post_id) {
            // Отключаем сохранение и отображаем ошибку
            remove_action('save_post_product', 'check_unique_sku_on_save', 10);
            wp_die('Ошибка: Артикул (SKU) должен быть уникальным. Дубликат найден у товара ID ' . $existing_post_id);
        }
    }
}

2. Очистка существующих дубликатов

Перед внедрением проверки лучше очистить текущие дубликаты, чтобы избежать конфликтов. Можно выгрузить список дубликатов SQL-запросом из раздела диагностики, затем вручную исправить SKU в админке или через экспорт/импорт CSV.

Для быстрой очистки можно использовать такой PHP-скрипт (выполнять в среде WP CLI или временно в functions.php):

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

    foreach ($duplicates as $dup) {
        $post_ids = explode(',', $dup->post_ids);
        // Оставляем первый товар без изменений, сбрасываем SKU у остальных
        array_shift($post_ids);
        foreach ($post_ids as $pid) {
            update_post_meta($pid, '_sku', '');
        }
    }
}
// remove_duplicate_skus(); // раскомментируйте для запуска один раз

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

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

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

  • Ошибка: Сохранение товара прерывается без сообщения. Проверьте, не конфликтует ли ваш код с другими плагинами, отключите их для теста.
  • Дубликаты не удаляются после запуска скрипта. Проверьте префиксы таблиц в SQL-запросах и корректность выполнения кода.
  • SKU пустые, но дубликаты всё равно есть. В запросах фильтруйте meta_value != '', чтобы исключить пустые значения.
  • Ошибка при массовом импорте товаров. Используйте проверку уникальности перед импортом или корректно настраивайте CSV-файлы, чтобы избежать дублирования.

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

  • Используйте транзакции и бэкапы базы перед массовым изменением SKU.
  • Добавьте индексы по meta_key и meta_value в таблице wp_postmeta для ускорения поиска дубликатов.
  • Ограничьте длину SKU до 60 символов — это стандарт для WooCommerce и большинства интеграций.
  • Для больших магазинов внедрите асинхронную проверку SKU при массовом импорте через WP-CLI или сторонние инструменты.

Сравнение способов контроля уникальности SKU

МетодПреимуществаНедостатки
Использование PHP-валидации при сохранении (как в статье)Простая реализация, блокирует сразу при сохранении, не требует плагиновНе защищает от дубли при массовом импорте без вызова save_post
Специализированные плагины SKU-менеджментаДополнительный функционал, интеграция с импортом и отчетамиНагрузка на сайт, возможны конфликты, требует обновлений
Использование уникальных индексов в базе данных (через SQL)Жёсткий контроль на уровне БД, высокая производительностьСложность внедрения, риск ошибок при миграциях
Как разрешить доступ к wp-admin по IP-адресам в WordPress
18.03.2026
Как создать автоматическое резервное копирование WordPress с помощью PHP
01.02.2026
Как использовать WooCommerce hooks для настройки магазина на WordPress
11.03.2026
Как создать отслеживание пользовательских действий в WordPress с помощью AJAX и REST API
10.01.2026
Как настроить очистку базы данных WordPress от старых данных
19.11.2025