Диагностика задачи: зачем отключать товар после продажи
В WooCommerce часто возникает необходимость автоматически скрывать или отключать товар сразу после того, как он был продан. Это актуально для уникальных или лимитированных товаров, например, эксклюзивных коллекций, арт-объектов, билетов или услуг с ограниченным количеством мест. Ручное отключение неудобно и чревато ошибками, поэтому автоматизация процесса экономит время и снижает риск продажи отсутствующего товара.
Как определить, что товар продан
Основным триггером будет смена статуса заказа на «завершён» (completed) или «обработан» (processing). В WooCommerce именно эти статусы означают, что оплата прошла успешно, и товар можно считать проданным. Поэтому логично использовать хук woocommerce_order_status_changed для отработки автоматического отключения товара.
Почему не использовать статус «в ожидании» или «на рассмотрении»
Эти статусы означают, что оплата не подтверждена, или заказ ещё не завершён, поэтому преждевременное отключение товара может привести к потере продаж.
Пошаговое решение: автоматическое отключение товара после продажи
Реализуем функцию, которая по событию смены статуса заказа перебирает все позиции и меняет статус товаров на «черновик» (draft), что эквивалентно отключению на витрине.
add_action('woocommerce_order_status_changed', 'auto_disable_products_after_sale', 10, 4);
function auto_disable_products_after_sale($order_id, $old_status, $new_status, $order) {
if (in_array($new_status, array('completed', 'processing'))) {
foreach ($order->get_items() as $item) {
$product_id = $item->get_product_id();
// Проверяем, что продукт опубликован
if (get_post_status($product_id) === 'publish') {
// Меняем статус на черновик
wp_update_post(array(
'ID' => $product_id,
'post_status' => 'draft'
));
}
}
}
}
Этот код добавьте в файл functions.php вашей дочерней темы или в собственный плагин.
Особенности реализации
- Обработка только при смене статуса на
completedиprocessing. - Изменение статуса товара с
publishнаdraft— стандартный способ скрыть товар с витрины. - Функция перебирает все товары в заказе — на случай, если в заказе несколько позиций.
Проверка результата после внедрения
- Создайте тестовый товар и опубликуйте его.
- Создайте новый заказ с этим товаром и установите статус
processingилиcompletedвручную или через имитацию покупки. - Проверьте статус товара в админке — он должен измениться на
draft. - Убедитесь, что товар больше не отображается на витрине сайта.
Частые ошибки и как их исправить
- Товар не отключается после смены статуса заказа.
Проверьте, что используете правильный хук и что статус меняется наcompletedилиprocessing. Возможно, заказ не меняет статус автоматически — в этом случае нужно вручную протестировать или добавить логи. - Изменился статус неправильного поста.
Убедитесь, чтоget_product_id()возвращает корректный ID товара, а не вариации или другие объекты. При необходимости используйтеget_product()->get_id(). - Отсутствует уведомление для администратора.
Добавьте логирование действий для отладки, напримерerror_log()внутри функции.
Практические советы по безопасности и производительности
- Ограничьте выполнение функции только для необходимых статусов, чтобы избежать лишних вызовов.
- Для сайтов с большим количеством заказов и товаров используйте асинхронные задачи (например, WP-Cron), чтобы не нагружать сервер.
- Перед массовым применением протестируйте на резервной копии сайта.
- Если используете сторонние плагины кэширования, очистите кэш после смены статусов товаров.
Альтернативные варианты и их сравнение
| Метод | Преимущества | Недостатки | Сложность |
|---|---|---|---|
Изменение статуса товара на draft | Простая реализация, стандартный способ скрытия | Товар полностью скрывается, невозможно временно показать | Низкая |
| Использование кастомного поля для отключения | Гибко: можно показывать с условием | Требует доработки темы/плагинов для фильтрации товаров | Средняя |
| Отключение через смену видимости (например, private) | Товар не видно обычным пользователям | Может влиять на SEO, сложнее управлять | Средняя |
Краткий чек-лист для внедрения
- Выбрать правильный хук для реакции на смену статуса заказа.
- Написать функцию, которая меняет статус товара на
draft. - Добавить функцию в
functions.phpили плагин. - Протестировать на тестовом заказе.
- Проверить отображение товара на сайте.
- Добавить логи для отладки и мониторинга работы.