Как быстро найти и исправить дублирующиеся SKU товаров в WooCommerce

Диагностика проблемы с дублирующимися 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, дополнительные функции оптимизацииПлатно, возможны конфликты с другими плагинамиМагазины с регулярными проблемами и большим каталогом
Как автоматически отслеживать и удалять неактивных пользователей в WordPress
11.05.2026
Как использовать хуки WooCommerce для добавления дополнительного функционала
07.05.2026
Как отключить AJAX в WooCommerce без потери функциональности
21.04.2026
Как автоматизировать создание и удаление черновиков в WordPress
10.04.2026
Как сделать автоматический откат обновлений WordPress при ошибках
06.03.2026