Диагностика проблемы с дублирующимися SKU в WooCommerce
Дублирующиеся артикулы (SKU) в WooCommerce приводят к проблемам с управлением товарами, инвентаризацией и интеграциями с внешними сервисами. WooCommerce не запрещает одинаковые SKU по умолчанию, поэтому ошибка обычно проявляется при синхронизации или импорте товаров.
Чтобы проверить наличие дублей, можно выполнить запрос к базе данных или использовать небольшой PHP-скрипт напрямую в WordPress.
Проверка через SQL-запрос
Подключитесь к базе данных и выполните запрос:
SELECT meta_value AS sku, COUNT(*) AS count_sku
FROM wp_postmeta
WHERE meta_key = '_sku' AND meta_value != ''
GROUP BY meta_value
HAVING count_sku > 1;
Этот запрос вернёт список SKU, которые используются в нескольких товарах.
Проверка через WP-CLI
Если у вас есть доступ к WP-CLI, выполните:
wp db query "SELECT meta_value AS sku, COUNT(*) AS count_sku FROM wp_postmeta WHERE meta_key = '_sku' AND meta_value != '' GROUP BY meta_value HAVING count_sku > 1;"
Результат покажет дубли.
Пошаговое решение: автоматическое удаление и исправление дублей SKU
Чтобы исправить проблему, можно использовать PHP-скрипт, который:
- Находит все дублирующиеся SKU
- Оставляет SKU у первого товара
- Удаляет SKU у остальных, чтобы избежать конфликтов
Пример кода для functions.php или отдельного плагина:
function wpstuff_fix_duplicate_skus() {
global $wpdb;
// Получаем дублирующиеся SKU
$duplicates = $wpdb->get_results(
"SELECT meta_value AS sku, GROUP_CONCAT(post_id) AS product_ids, COUNT(*) AS count_sku
FROM {$wpdb->postmeta}
WHERE meta_key = '_sku' AND meta_value != ''
GROUP BY meta_value
HAVING count_sku > 1"
);
if ( empty($duplicates) ) {
echo 'Дублирующихся SKU не найдено.';
return;
}
foreach ( $duplicates as $dup ) {
$product_ids = explode(',', $dup->product_ids);
// Оставляем SKU у первого продукта, у остальных очищаем
array_shift($product_ids); // первый оставляем
foreach ( $product_ids as $product_id ) {
delete_post_meta( $product_id, '_sku' );
}
}
echo 'Дублирующиеся SKU успешно исправлены.';
}
// Запуск функции вручную, например, через add_action('admin_init') или WP-CLI
// wpstuff_fix_duplicate_skus();
Рекомендуется запускать скрипт один раз вручную, например, через подключение к админке или WP-CLI, чтобы избежать постоянного удаления SKU.
Проверка результата после исправления
Повторите SQL-запрос или WP-CLI команду из раздела диагностики. Если дубли исчезли, значит исправление прошло успешно.
Также проверьте в админке WooCommerce, что у товаров нет одинаковых SKU.
Частые ошибки при работе с SKU и их исправление
- Ошибка: Дублирующиеся SKU не отображаются в админке.
Причина: Админка не показывает предупреждения по умолчанию.
Решение: Используйте SQL-запросы или WP-CLI для диагностики. - Ошибка: Удаление SKU приводит к проблемам с синхронизацией.
Причина: Некоторые интеграции требуют уникальный SKU.
Решение: При очистке SKU обязательно запишите в документацию, что у товара временно отсутствует SKU, для последующего исправления. - Ошибка: Автоматическое исправление запускается постоянно и удаляет SKU у новых товаров.
Причина: Функция запускается на каждом admin_init.
Решение: Запускайте функцию вручную или через WP-CLI, не вешайте на хук без условий.
Практические советы по безопасности и производительности
- Перед запуском любых скриптов для массового изменения базы данных создайте резервную копию.
- Для больших магазинов с тысячами товаров используйте WP-CLI для быстрого выполнения запросов, чтобы не нагружать сервер.
- Ограничьте использование функции исправления дублей только администраторам.
- Для предотвращения появления дублей в будущем можно добавить проверку при сохранении товара через хук
save_post_product:
add_action('save_post_product', 'wpstuff_check_unique_sku', 10, 3);
function wpstuff_check_unique_sku($post_ID, $post, $update) {
if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) return;
$sku = get_post_meta($post_ID, '_sku', true);
if ( !$sku ) return;
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => '_sku',
'value' => $sku,
'compare' => '=',
],
],
'post__not_in' => [$post_ID],
'fields' => 'ids',
];
$query = new WP_Query($args);
if ( $query->have_posts() ) {
// Если дубли найдены, удаляем SKU чтобы избежать конфликта
delete_post_meta($post_ID, '_sku');
// Можно добавить админское уведомление, не показано тут
}
}
Сравнение методов устранения дублей SKU
| Метод | Плюсы | Минусы | Подходит для |
|---|---|---|---|
| Ручная проверка и исправление через админку | Простота, не требует кода | Трудозатратно на больших магазинах | Малые магазины до 100 товаров |
| SQL-запрос и массовое исправление скриптом | Автоматизация, быстрота | Требует навыков работы с базой и кодом | Средние и крупные магазины |
| Плагины для управления SKU (например, Clearfy Pro) | Удобный UI, дополнительные функции оптимизации | Платно, возможны конфликты с другими плагинами | Магазины с регулярными проблемами и большим каталогом |