Диагностика проблемы дублирования SKU в WooCommerce
Дублирование артикулов (SKU) в WooCommerce вызывает проблемы с учётом товаров, инвентаризацией и интеграциями с платёжными системами и складским учётом. WooCommerce по умолчанию не запрещает одинаковые SKU, но многие плагины и внешние сервисы требуют уникальности. Для начала нужно понять, есть ли дубли.
Проверка наличия дублирующихся SKU
Для поиска дубликатов можно использовать прямой запрос к базе данных MySQL. Например, в phpMyAdmin выполните:
SELECT meta_value AS sku, COUNT(*) AS count
FROM wp_postmeta
WHERE meta_key = '_sku'
GROUP BY meta_value
HAVING count > 1;
Этот запрос покажет все SKU, которые встречаются более одного раза. Если список пуст — дубликатов нет.
Также можно использовать WP-CLI для поиска дубликатов:
wp db query "SELECT meta_value AS sku, COUNT(*) AS count FROM wp_postmeta WHERE meta_key = '_sku' GROUP BY meta_value HAVING count > 1;"
Пошаговое решение: как убрать дубли SKU в WooCommerce
- Резервное копирование базы данных
Перед любыми изменениями сделайте полное резервное копирование базы данных и файлов. - Автоматический поиск и исправление дубликатов
Можно написать PHP-скрипт, который найдёт дубликаты и автоматически добавит к ним суффиксы для уникальности:
function fix_duplicate_skus() {
global $wpdb;
$duplicates = $wpdb->get_results(
"SELECT meta_value AS sku, GROUP_CONCAT(post_id) AS posts, COUNT(*) AS count
FROM {$wpdb->postmeta}
WHERE meta_key = '_sku'
GROUP BY meta_value
HAVING count > 1"
);
foreach ($duplicates as $dup) {
$post_ids = explode(',', $dup->posts);
// Пропускаем первый товар, меняем остальные
array_shift($post_ids);
$index = 1;
foreach ($post_ids as $post_id) {
$new_sku = $dup->sku . '-'. $index;
// Обновляем SKU
update_post_meta($post_id, '_sku', $new_sku);
$index++;
}
}
}
// Запуск функции
fix_duplicate_skus();
Этот код можно выполнить разово, например, через подключение к functions.php вашей темы или с помощью плагина Code Snippets.
- Проверка и исправление вручную
Если у вас мало товаров, проще исправить SKU через админку WooCommerce в карточках товаров. - Добавление проверки уникальности SKU при сохранении товара
Чтобы избежать повторений в будущем, добавим хук, который будет проверять уникальность SKU при сохранении товара:
add_action('woocommerce_admin_process_product_object', 'check_unique_sku_on_save', 10, 1);
function check_unique_sku_on_save($product) {
$sku = $product->get_sku();
if (!$sku) return; // Если SKU пустой, пропускаем
$args = [
'post_type' => 'product',
'meta_query' => [
[
'key' => '_sku',
'value' => $sku,
'compare' => '=',
],
],
'post__not_in' => [$product->get_id()],
'posts_per_page' => 1,
'fields' => 'ids',
];
$query = new WP_Query($args);
if ($query->have_posts()) {
wp_die('Ошибка: SKU должен быть уникальным. Текущий SKU уже используется другим товаром.');
}
}
Проверка результата после внедрения
- Запустите SQL-запрос из раздела диагностики — дубликатов не должно быть.
- Попробуйте добавить товар с уже существующим SKU — система должна выдать ошибку.
- Проверьте работу плагинов и интеграций, которые зависят от уникального SKU.
Частые ошибки при исправлении дублирующихся SKU
- Отсутствие резервного копирования — потеря данных при ошибках в коде.
- Обновление SKU без учёта внешних интеграций — может привести к рассинхронизации с учётом на складе или маркетплейсах.
- Пропуск проверки уникальности при создании товаров — дубликаты появляются снова.
- Использование нестандартных плагинов, которые хранят SKU в других метаполях — SQL-запрос не находит все дубликаты.
Практические советы по безопасности и производительности
- Не запускайте скрипты исправления SKU на живом сайте в часы пиковых нагрузок — возможны задержки и ошибки.
- Используйте транзакции при массовом обновлении метаданных, чтобы откатить изменения при сбоях.
- Для сайтов с большим каталогом товаров рассмотрите использование WP-CLI для автоматизации и оптимизации запросов.
- Следите за индексацией поля
_skuв базе данных для ускорения запросов.
Сравнение вариантов решения проблемы дублирования SKU
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное исправление в админке | Простота, подходит для малого количества товаров | Затратно по времени, риск пропустить дубликаты |
| Автоматический скрипт PHP | Быстрое исправление большого количества SKU | Риск ошибок без резервного копирования, требует технических навыков |
| Использование плагинов для контроля SKU | Автоматическая проверка и удобный интерфейс | Дополнительная нагрузка на сайт, возможны конфликты с другими плагинами |