Диагностика проблемы с дубликатами 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.
Пошаговое внедрение решения
- Создайте резервную копию базы данных.
- Добавьте приведенный код в файл
functions.phpвашей дочерней темы или создайте отдельный плагин. - Отредактируйте любой товар с дублирующимся 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 и убедитесь, что к ним добавлен суффикс.
Частые ошибки и как их исправить
- Код не срабатывает при сохранении товара: убедитесь, что хук
save_post_productиспользуется, а неsave_post. Проверьте, что код подключен и нет PHP-ошибок. - SKU не обновляется в админке: возможно, другие плагины вмешиваются в сохранение мета-данных. Для теста отключите все сторонние плагины кроме WooCommerce.
- Проблемы с кешем: очистите кеш сайта и браузера после внесения изменений.
- Некорректная работа с вариациями: вариации имеют свои SKU, проверяйте их отдельно, используя тип записи
product_variation.
Практические советы по безопасности и производительности
- Используйте транзакции, если делаете массовое обновление SKU через SQL.
- Код не должен вызывать бесконечные циклы обновления. В нашем примере мы обновляем SKU только при обнаружении дубликатов, что безопасно.
- Периодически проверяйте базу на наличие дубликатов, особенно после импорта товаров или массовых обновлений.
- Для более сложных сценариев интегрируйте проверку уникальности SKU в процессы импорта через WP CLI или API.
Сравнение вариантов решения дубликатов SKU
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Ручное исправление в админке | Просто, не требует кода | Трудоемко, ошибки возможны | Подходит для небольших магазинов |
| Плагин проверки уникальности SKU | Автоматизация, уведомления | Зависимость от сторонних решений, возможные конфликты | Хорошо для магазинов со стандартными нуждами |
| Кастомный код для автоматического исправления | Гибкость, контроль, интеграция в бизнес-процессы | Требует поддержки и тестирования | Оптимально для крупных и кастомизированных магазинов |