Что значит автоматическое отключение товара в WooCommerce?
В WooCommerce часто возникает задача автоматически отключать товар после того, как он был продан. Это актуально для ограниченных по количеству товаров, эксклюзивных предложений или одноразовых акций. Отключение товара предотвращает дальнейшие продажи и упрощает управление складом.
Диагностика: когда и почему нужно отключать товар автоматически
Основные причины для автоматического отключения:
- Товар имеет ограниченный запас (например, 1 штука) и после продажи становится недоступен.
- Товар продается в рамках акции или эксклюзива, и после первой продажи снимается с продажи.
- Необходим контроль наличия без постоянного ручного обновления.
Проверка актуального статуса товара вручную через админку WooCommerce неудобна и подвержена ошибкам.
Как реализовать автоматическое отключение товара после успешной продажи
Для автоматического отключения нужно отслеживать событие успешной оплаты и изменять статус товара на "черновик" или "вне продажи".
Использование хука woocommerce_order_status_completed
Этот хук срабатывает при смене статуса заказа на "завершён", что означает успешную оплату и обработку.
add_action('woocommerce_order_status_completed', 'auto_disable_product_after_sale', 10, 1);function auto_disable_product_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(); $product = wc_get_product($product_id); if (!$product) { continue; } // Проверяем, что товар активен if ($product->get_status() !== 'publish') { continue; } // Отключаем товар (меняем статус) $product->set_status('draft'); // или 'private' для скрытия $product->save(); }}Такой код автоматически переводит все проданные товары из заказа в статус "черновик", делая их недоступными для покупки.
Ограничение по конкретным товарам
Если требуется отключать только определённые товары, например, из определённой категории или с мета-полем, добавьте проверку:
if (!has_term('exclusives', 'product_cat', $product_id)) { continue;}Это позволит точечно контролировать автоматизацию.
Как проверить, что автоматическое отключение работает
- Оформите тестовый заказ с нужным товаром.
- Убедитесь, что заказ получил статус "завершён" (completed).
- Перейдите в админку WooCommerce - Товары и проверьте статус товара: он должен измениться на "черновик".
- Попробуйте найти товар на сайте — он должен быть недоступен для покупки и не отображаться в каталоге.
Частые ошибки при реализации и как их исправить
- Хук не срабатывает из-за неправильного статуса заказа. Убедитесь, что заказ действительно меняет статус на "completed". Если используется другой статус для подтверждения оплаты — меняйте хук или добавьте дополнительный.
- Товар не меняет статус. Проверьте права пользователя, под которым запускается код, и отсутствие конфликтов с другими плагинами, которые могут перезаписывать статусы.
- Автоматическое отключение отключает все товары, а нужно выборочно. Добавьте фильтрацию по категории, тегу или мета-полю, как показано выше.
Практические советы по безопасности и производительности
- Добавляйте логи при изменении статуса товара, чтобы отслеживать работу скрипта:
error_log('Product '.$product_id.' disabled after sale.'); - Проверяйте наличие товара перед изменением статуса, чтобы избежать ошибок с удалёнными продуктами.
- Если товаров много в заказе, используйте транзакции базы данных или отложенные задачи, чтобы не перегружать сайт.
Сравнение способов реализации автоматического отключения
| Метод | Плюсы | Минусы |
|---|---|---|
Использование хука woocommerce_order_status_completed | Простая реализация, срабатывает сразу после продажи | Меняет статус всех товаров из заказа без фильтрации по умолчанию |
| Расширенная фильтрация по категориям/атрибутам | Точный контроль над отключением, исключает ненужные товары | Требует дополнительного кода и обслуживания |
| Плагины с расширенными возможностями (например, WPShop Clearfy Pro) | Удобный интерфейс, дополнительные функции оптимизации | Платные решения, могут грузить сайт лишним функционалом |