Диагностика проблемы: почему появляются дубли 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
| Метод | Преимущества | Недостатки |
|---|---|---|
| Ручное исправление в админке | Просто, не требует кода | Долго при большом количестве товаров, риск пропустить дубликаты |
| Автоматический скрипт исправления | Быстро исправляет все дубликаты сразу | Требует доступа к серверу, риск ошибок без бэкапа |
| Проверка при сохранении товара | Предотвращает появление дубликатов | Не исправляет старые ошибки |
| Исправление на этапе импорта | Автоматическая корректировка новых товаров | Зависит от импорта, сложнее внедрять |