WooCommerce: решение проблемы с нерабочим автоприсвоением SKU к товару

Диагностика проблемы с автоприсвоением SKU в WooCommerce

Часто при создании новых товаров в WooCommerce возникает задача автоматически присваивать уникальный SKU (артикул). Это удобно для управления складом и интеграций. Однако механизм автогенерации может не работать или давать дубли. Чтобы понять, почему так происходит, нужно проверить несколько моментов:

  • Правильно ли подключен хук автоприсвоения?
  • Нет ли конфликтов с другими плагинами, которые влияют на метаданные товаров.
  • Корректно ли генерируется уникальный идентификатор, нет ли дублирующихся значений в базе.
  • Проверить, не перезаписывается ли SKU где-то после автогенерации.

Для начала в файле functions.php вашей темы или плагина нужно добавить простой отладочный код, который будет выводить SKU при сохранении товара:

add_action('woocommerce_process_product_meta', 'debug_sku_autogenerated', 20, 1);
function debug_sku_autogenerated($product_id) {
    $product = wc_get_product($product_id);
    error_log('SKU при сохранении товара ID '.$product_id.' = '.$product->get_sku());
}

После сохранения товара проверьте логи PHP (обычно error_log или в панели хостинга). Если SKU пустой — автоприсвоение не срабатывает.

Пошаговое решение: как реализовать надежное автоприсвоение SKU

Оптимальный способ — создать уникальный SKU на основе ID товара и текущей даты/времени или последовательного счетчика. Вот пример функции для автоприсвоения SKU при первом сохранении товара:

add_action('woocommerce_process_product_meta', 'auto_assign_sku_if_empty', 10, 1);
function auto_assign_sku_if_empty($product_id) {
    $product = wc_get_product($product_id);
    if (!$product->get_sku()) {
        // Формируем уникальный SKU: PRD-<ID>-<timestamp>
        $sku = 'PRD-' . $product_id . '-' . time();
        // Проверяем уникальность
        if (!wc_get_product_id_by_sku($sku)) {
            $product->set_sku($sku);
            $product->save();
        }
    }
}

Этот код срабатывает при сохранении товара и присваивает SKU, если поле пустое. Формат можно поменять под свои требования.

Проверка результата

Чтобы убедиться, что SKU присвоился:

  • Зайдите в админку WooCommerce в редактирование товара, у которого не было SKU.
  • Сохраните товар.
  • Убедитесь, что поле SKU теперь заполнено.
  • Проверьте в базе данных в таблице wp_postmeta для товара с ключом _sku, что значение уникальное.

Частые ошибки и как их исправить

  • SKU не присваивается вообще: Проверьте, что код вставлен в правильное место и что нет ошибок PHP. Включите отображение ошибок и логи.
  • Дубли SKU: При генерации не проверяйте уникальность с помощью wc_get_product_id_by_sku(). Добавьте проверку и при необходимости меняйте схему генерации.
  • SKU перезаписывается после автоприсвоения: Возможно, другой плагин или код перезаписывает поле. Отключите сторонние плагины для теста.
  • Проблемы с сохранением товара после автоприсвоения: Используйте хук с приоритетом не ниже 10, чтобы избежать конфликтов.

Практические советы по безопасности и производительности

  • Не храните в SKU чувствительную информацию — SKU должен быть нейтральным идентификатором.
  • Избегайте слишком длинных или сложных SKU, чтобы не нагружать базу и UI.
  • Используйте постоянные префиксы для SKU, чтобы избежать конфликтов с другими системами.
  • Проверяйте уникальность SKU при импорте товаров — плохая практика иметь дубликаты.

Сравнение способов автоприсвоения SKU

МетодПреимуществаНедостатки
Генерация на основе ID и timestampПростота, уникальность гарантированаSKU длинный, нечитабельный
Последовательный числовой счетчикКороткий, удобный для складаНужна дополнительная таблица или опция для хранения счетчика
Использование UUID или GUIDМаксимальная уникальностьОчень длинный и сложный для пользователя

Дополнительный пример: автоприсвоение с использованием счетчика

function get_next_sku_number() {
    $next = get_option('my_next_sku_number', 1000);
    update_option('my_next_sku_number', $next + 1);
    return $next;
}

add_action('woocommerce_process_product_meta', 'auto_assign_sku_counter', 10, 1);
function auto_assign_sku_counter($product_id) {
    $product = wc_get_product($product_id);
    if (!$product->get_sku()) {
        $sku = 'SKU-' . get_next_sku_number();
        if (!wc_get_product_id_by_sku($sku)) {
            $product->set_sku($sku);
            $product->save();
        }
    }
}
WooCommerce: как автоматически удалять заказы по срокам и избежать дублирования
12.06.2026
Автоматическое удаление старых комментариев в WordPress
09.02.2026
Как устроить автоматический отчет о ошибках WordPress с уведомлениями на почту
22.01.2026
Как создать уникальные отзывы с пользователем в WordPress
29.03.2026
WooCommerce: как автоматически очищать корзину и историю заказов по времени
10.07.2026