Диагностика задачи: зачем и когда изменять статью товара после покупки
В WooCommerce часто возникает задача автоматически изменять артикул (SKU) или другую уникальную мета-информацию товара после его покупки. Например, для блокировки повторных заказов, обновления состояния товара или реализации особенностей складского учета. Стандартный функционал WooCommerce не предусматривает автоматическую модификацию артикула, поэтому приходится внедрять кастомные решения.
Основные вопросы перед решением:
- Какой именно параметр товара нужно менять — артикул, мета-поле, таксономия?
- На каком этапе — сразу после оплаты, при смене статуса заказа или позже?
- Как избежать сбоев в заказах и не нарушить логику WooCommerce?
Подключение к событию смены статуса заказа
Для изменения данных товара после покупки оптимально использовать хук woocommerce_order_status_completed или woocommerce_order_status_processing, так как именно после смены статуса можно быть уверенным, что покупка завершена.
Пример привязки функции:
add_action('woocommerce_order_status_completed', 'wpup_change_product_sku_after_purchase');Пошаговое решение: изменение артикула товара после покупки
1. Получаем данные заказа и список купленных товаров
function wpup_change_product_sku_after_purchase( $order_id ) {
if ( ! $order_id ) {
return;
}
$order = wc_get_order( $order_id );
if ( ! $order ) {
return;
}2. Перебираем товары и меняем артикул
foreach ( $order->get_items() as $item_id => $item ) {
$product = $item->get_product();
if ( ! $product ) {
continue;
}
// Получаем текущий артикул
$current_sku = $product->get_sku();
// Формируем новый артикул (например, добавляем префикс "sold-")
$new_sku = 'sold-' . $current_sku;
// Меняем артикул
$product->set_sku( $new_sku );
$product->save();
}
}В этом примере к текущему артикулу добавляется префикс sold-. Логика замены может быть любой — например, генерация уникального кода или удаление артикула для блокировки.
Проверка результата после внедрения
- Оформите тестовый заказ в WooCommerce.
- После смены статуса заказа на «Завершен» откройте карточку купленного товара в админке.
- Проверьте, что артикул изменился согласно логике функции.
- Убедитесь, что новый артикул не конфликтует с существующими (артикулы должны быть уникальными).
Частые ошибки и способы их исправления
- Ошибка: Новый артикул дублируется с существующим.
Решение: Перед присвоением нового артикула используйте функциюwc_get_product_id_by_sku($new_sku)для проверки уникальности. - Ошибка: Артикул не меняется после заказа.
Решение: Проверьте, что хук привязан корректно и функция запускается. Можно добавитьerror_logдля отладки. - Ошибка: Конфликт с плагинами инвентаризации или синхронизации.
Решение: Проверьте совместимость, возможно, нужно менять артикул на более позднем этапе или через очередь задач.
Практические советы по безопасности и производительности
- Не меняйте артикул, если он связан с внешними системами (например, 1С), без согласования.
- Используйте транзакции или блокировки, если меняете артикулы у большого количества товаров, чтобы избежать гонок записей.
- Кэшируйте данные, если планируете массовые операции после покупки.
- Храните оригинальный артикул в мета-поле, чтобы можно было откатить изменения при необходимости.
Сравнение способов изменения артикула после покупки
| Метод | Где реализуется | Плюсы | Минусы |
|---|---|---|---|
| Через хук статуса заказа | functions.php или плагин | Простота, автоматизация | Требует проверки уникальности, совместимости |
| Отдельный скрипт с WP-CLI | Через консоль | Подходит для массовых изменений | Не автоматично, требует ручного запуска |
| Использование сторонних плагинов | Готовые решения | Может иметь UI, настройки | Может быть избыточным или платным |