wpinc.ru wordpress WP Inc

Почему в WooCommerce возникают дубли артикулов (SKU) и как это исправить

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

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

Проверка дубликатов SKU возможна через SQL-запрос к базе данных:

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 в WooCommerce

  • Импорт товаров из CSV или сторонних систем без проверки уникальности.
  • Ошибки при программном создании или обновлении товаров через API или кастомный код.
  • Плагины для импорта/экспорта, которые не проверяют уникальность SKU.
  • Ручное добавление товаров с одинаковым SKU разными администраторами без согласованности.

Пошаговое решение проблемы дублирующихся SKU

1. Создайте резервную копию базы данных

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

2. Найдите и исправьте дубли через SQL-запрос

Получите список дублирующихся SKU, как в примере выше. Затем вручную или с помощью скрипта обновите/удалите дубли.

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

Пример кода для удаления товаров-дублей, оставляя один товар с уникальным SKU (следует применять осторожно):

function remove_duplicate_sku_products() {
    global $wpdb;
    $duplicates = $wpdb->get_results(
        "SELECT meta_value AS sku, GROUP_CONCAT(post_id ORDER BY post_id) as ids, COUNT(*) as count
         FROM {$wpdb->postmeta}
         WHERE meta_key = '_sku' AND meta_value != ''
         GROUP BY meta_value
         HAVING count > 1"
    );
    foreach ( $duplicates as $dup ) {
        $ids = explode(',', $dup->ids);
        // Оставляем первый товар, остальные удаляем
        array_shift($ids);
        foreach ($ids as $id) {
            wp_delete_post($id, true); // Полное удаление
        }
    }
}
// Запустить функцию один раз вручную
// remove_duplicate_sku_products();

4. Внедрите проверку уникальности SKU при сохранении товара

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

add_action('woocommerce_admin_process_product_object', 'check_unique_sku', 10, 1);
function check_unique_sku($product) {
    $sku = $product->get_sku();
    if (!$sku) return;

    $args = [
        'post_type' => 'product',
        'post_status' => 'publish',
        'meta_query' => [
            [
                'key' => '_sku',
                'value' => $sku,
                'compare' => '=',
            ]
        ],
        'fields' => 'ids',
        'posts_per_page' => -1,
    ];
    $posts = get_posts($args);
    foreach ($posts as $post_id) {
        if ($post_id != $product->get_id()) {
            wc_add_notice(sprintf('Ошибка: SKU "%s" уже существует в товаре ID %d.', $sku, $post_id), 'error');
            // Можно отменить сохранение, выбросить исключение или иным способом предупредить
        }
    }
}

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

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

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

  • Дубли не исчезают после удаления товаров — возможно, дубли остались в таблице wp_postmeta без связанных постов. Выполните очистку мета данных с несуществующими товарами.
  • Скрипт удаления дублей удаляет нужные товары — всегда делайте резервную копию и тестируйте на копии сайта.
  • Сообщения об ошибках при сохранении товара не отображаются — убедитесь, что в админке WooCommerce включены уведомления, и что хук подключён правильно.
  • Импорт товаров продолжает создавать дубли — настройте или замените плагин импорта на поддерживающий проверку SKU.

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

  • Не храните пустые или невалидные SKU — это может запутать систему и ухудшить поиск.
  • Для массовых исправлений используйте SQL-запросы или WP CLI, чтобы избежать нагрузки через HTTP-запросы.
  • Если используете плагин импорта, выбирайте те, которые поддерживают проверку и обновление по уникальному SKU.
  • Регулярно проверяйте базу на дубли SKU, особенно перед большими обновлениями или миграциями.

Сравнение способов устранения дублирующихся SKU

МетодПлюсыМинусыРекомендации
Ручное исправление через админкуКонтроль над каждым товаромДолго при большом количествеПодходит для небольших магазинов
Использование SQL-запросовБыстро и массовоРиск удаления нужных данных без бэкапаТолько с резервной копией и знанием SQL
Автоматический скрипт на PHPАвтоматизация, можно интегрировать в задачи администрированияТребует тестирования, может быть опасенИспользовать на тестовом сайте перед продакшеном
Проверка уникальности SKU при сохраненииПредотвращает появление новых дублейНе решает уже существующие дублиОбязательно для поддержания чистоты данных
×
Оптимизируй свой сайт!

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

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