Диагностика задачи: зачем отключать товар после продажи
В интернет-магазинах на WooCommerce бывают ситуации, когда товар нужно автоматически сделать "нет в наличии" или полностью отключить после первой продажи. Это актуально для эксклюзивных или единичных товаров, единичных коллекций или уникальных позиций, которые нельзя продавать повторно. Ручное отключение товара после каждой продажи неудобно и может привести к ошибкам и перепродажам.
Пошаговое решение: автоматическое отключение товара после успешной оплаты
Используем хук WooCommerce для изменения статуса товара
Для реализации автоматического отключения товара после продажи нужно отследить событие успешной оплаты заказа и изменить статус поста товара на "черновик" или "нет в наличии".
Ниже пример кода, который отключает все товары из заказа сразу после смены статуса заказа на "завершённый":
add_action('woocommerce_order_status_completed', 'wc_disable_products_after_sale', 10, 1);
function wc_disable_products_after_sale($order_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
if (!$order) return;
foreach ($order->get_items() as $item) {
$product_id = $item->get_product_id();
if ($product_id) {
// Смена статуса товара на черновик
$post = array(
'ID' => $product_id,
'post_status' => 'draft'
);
wp_update_post($post);
}
}
}Если нужно не полностью отключать товар, а просто менять его наличие, можно использовать изменение мета-поля _stock_status:
add_action('woocommerce_order_status_completed', 'wc_set_product_out_of_stock_after_sale', 10, 1);
function wc_set_product_out_of_stock_after_sale($order_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
if (!$order) return;
foreach ($order->get_items() as $item) {
$product = $item->get_product();
if ($product && $product->managing_stock()) {
$product->set_stock_quantity(0);
$product->set_stock_status('outofstock');
$product->save();
}
}
}Проверка результата после внедрения
- Создайте тестовый заказ с нужным товаром и оплатите его (через тестовый режим платежа или вручную смените статус заказа на "завершённый").
- Проверьте в админке, что статус товара изменился на "черновик" или товар стал отсутствовать на складе.
- Убедитесь, что товар не отображается на сайте для покупателей.
- Если используется изменение статуса "outofstock", проверьте, что на странице товара отображается сообщение о его отсутствии.
Частые ошибки и как их исправить
- Неверно указанный хук: Используйте именно
woocommerce_order_status_completedдля действия после оплаты, а неwoocommerce_payment_complete, если нужны именно завершённые заказы. - Пропуск проверки объекта заказа и товаров: Добавляйте проверки на существование заказа и товаров, чтобы избежать ошибок PHP.
- Не учитывается тип товара: Для вариативных товаров нужно работать с вариациями, а не с основным товаром. Используйте
$item->get_variation_id(), если применимо. - Кэширование и задержки: При использовании плагинов кеширования изменения могут отображаться с задержкой. Очищайте кеш после тестов.
Практические советы по безопасности и производительности
- Внесите код в дочернюю тему или в плагин-сниппет, чтобы не потерять изменения при обновлении.
- Добавьте логирование действий для отладки, например, через
error_log()или специализированные плагины. - Для массовых заказов с большим количеством товаров оптимизируйте код, чтобы не вызывать лишних запросов.
- Если магазин использует сторонние плагины для управления запасами, тестируйте совместимость.
Варианты реализации: код vs плагины
| Метод | Преимущества | Недостатки |
|---|---|---|
| Код в functions.php или плагин-сниппет | Полный контроль, отсутствие дополнительных плагинов, легкость кастомизации | Требует навыков программирования, возможны ошибки без тестов |
| Плагины управления запасами | Готовые решения, удобный интерфейс, поддержка | Зависимость от разработчика, нагрузка на сайт, возможные конфликты |