Диагностика проблемы с дублирующимися SKU в WooCommerce
SKU (Stock Keeping Unit) — уникальный идентификатор товара, который помогает управлять запасами и интегрировать магазин с внешними системами. Дублирование SKU может привести к ошибкам при учёте товаров, проблемам с импортом/экспортом и некорректному отображению товара в админке.
Основные признаки дублирующихся SKU:
- Ошибка при сохранении или импорте товаров с сообщением о существующемся SKU.
- Неправильное отображение остатков товара или заказов.
- Конфликты при интеграции с 1С, CRM, складскими системами.
WooCommerce по умолчанию не запрещает одинаковые SKU, поэтому вручную или программно их нужно искать и исправлять.
Как найти дубли SKU в базе данных WooCommerce
Для поиска дублирующихся SKU удобно использовать SQL-запрос к базе WordPress, потому что SKU хранится в метаданных товаров (meta_key = '_sku').
SELECT meta_value AS sku, COUNT(*) AS count FROM wp_postmeta WHERE meta_key = '_sku' AND meta_value <> '' GROUP BY meta_value HAVING count > 1;Этот запрос выведет все SKU, которые встречаются более одного раза. Если таблица у вас называется иначе (например, с префиксом), замените wp_postmeta на ваш префикс.
Поиск всех товаров с проблемным SKU
SELECT p.ID, p.post_title, pm.meta_value AS sku FROM wp_posts p JOIN wp_postmeta pm ON p.ID = pm.post_id WHERE pm.meta_key = '_sku' AND pm.meta_value = 'ПРОБЛЕМНЫЙ_SKU';Подставьте в запрос нужный SKU из результатов первого запроса, чтобы получить все товары с этим SKU.
Пошаговое решение: удаление и исправление дублей SKU
1. Создайте резервную копию базы данных
Перед любыми изменениями обязательно сделайте полную резервную копию базы данных. Это позволит откатить изменения при ошибках.
2. Автоматизированный скрипт на PHP для поиска и исправления дублей
Пример скрипта, который можно запустить в среде WP-CLI или подключив к теме/плагину (после тестирования на тестовом сайте):
function fix_duplicate_skus() {
global $wpdb;
$duplicates = $wpdb->get_col("SELECT meta_value FROM {$wpdb->postmeta} WHERE meta_key = '_sku' AND meta_value <> '' GROUP BY meta_value HAVING COUNT(*) > 1");
foreach ($duplicates as $sku) {
$posts = $wpdb->get_col($wpdb->prepare(
"SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key = '_sku' AND meta_value = %s",
$sku
));
// Начинаем со второго товара, оставляем первый без изменений
for ($i = 1; $i < count($posts); $i++) {
$new_sku = $sku . '-dup-' . $i;
update_post_meta($posts[$i], '_sku', $new_sku);
error_log("SKU дубли $sku изменён на $new_sku для товара ID {$posts[$i]}");
}
}
}
fix_duplicate_skus();Этот код добавляет суффиксы для дублирующихся SKU, чтобы сделать их уникальными.
3. Проверка уникальности SKU после исправления
Повторите SQL-запрос из раздела «Диагностика» для проверки, что дубли отсутствуют:
SELECT meta_value AS sku, COUNT(*) AS count FROM wp_postmeta WHERE meta_key = '_sku' AND meta_value <> '' GROUP BY meta_value HAVING count > 1;Если запрос не возвращает результатов — дубли успешно устранены.
Проверка результата после внедрения
- Откройте в админке WooCommerce несколько товаров с изменёнными SKU и убедитесь, что новые значения корректно отображаются.
- Попробуйте провести импорт/экспорт товаров, чтобы проверить отсутствие конфликтов.
- Если используете интеграции (1С, CRM), выполните тестовую синхронизацию.
Частые ошибки и как их исправить
- Ошибка: Скрипт не изменяет SKU — возможно, права пользователя недостаточны или код не выполнен в среде WordPress.
Решение: Запускайте через WP-CLI или добавляйте код в functions.php временно с проверкой прав. - Ошибка: Дубли появляются снова после импорта товаров.
Решение: Проверьте настройки импорта — большинство плагинов позволяют выставить уникальность SKU, либо пропишите в импорте проверку дублирования. - Ошибка: Некоторые товары имеют пустой SKU.
Решение: Добавьте проверку для пустых значений, так как пустой SKU тоже может вызвать конфликт.
Практические советы для предотвращения дублирования SKU
- Настройте уникальность SKU на уровне импорта — используйте плагины с проверкой или пишите кастомные фильтры.
- Добавьте в functions.php проверку при сохранении товара:
add_action('woocommerce_admin_process_product_object', function($product) {
$sku = $product->get_sku();
if (empty($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, $product->get_id()
));
if ($exists) {
wc_add_notice('SKU должен быть уникальным. Такой SKU уже существует.', 'error');
remove_action('woocommerce_admin_process_product_object', __FUNCTION__);
}
});- Регулярно проверяйте базу данных на дубли с помощью SQL-запроса.
- Используйте Clearfy Pro для автоматической чистки и оптимизации базы, включая удаление невалидных метаданных.
Сравнение способов устранения дублей SKU
| Метод | Преимущества | Недостатки |
|---|---|---|
| Ручная корректировка в админке | Простота, подходит для небольшого количества товаров | Долговременно, риск пропуска ошибок |
| SQL-запросы + скрипты | Автоматизация, быстрое исправление большого объёма | Требует навыков работы с БД и PHP |
| Плагины для управления SKU | Удобство, интеграция с импортом/экспортом | Могут влиять на производительность, платные решения |