WooCommerce: как автоматически отключить товар после продажи

Диагностика задачи: зачем отключать товар после продажи

В 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 — стандартный способ скрыть товар с витрины.
  • Функция перебирает все товары в заказе — на случай, если в заказе несколько позиций.

Проверка результата после внедрения

  1. Создайте тестовый товар и опубликуйте его.
  2. Создайте новый заказ с этим товаром и установите статус processing или completed вручную или через имитацию покупки.
  3. Проверьте статус товара в админке — он должен измениться на draft.
  4. Убедитесь, что товар больше не отображается на витрине сайта.

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

  • Товар не отключается после смены статуса заказа.
    Проверьте, что используете правильный хук и что статус меняется на completed или processing. Возможно, заказ не меняет статус автоматически — в этом случае нужно вручную протестировать или добавить логи.
  • Изменился статус неправильного поста.
    Убедитесь, что get_product_id() возвращает корректный ID товара, а не вариации или другие объекты. При необходимости используйте get_product()->get_id().
  • Отсутствует уведомление для администратора.
    Добавьте логирование действий для отладки, например error_log() внутри функции.

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

  • Ограничьте выполнение функции только для необходимых статусов, чтобы избежать лишних вызовов.
  • Для сайтов с большим количеством заказов и товаров используйте асинхронные задачи (например, WP-Cron), чтобы не нагружать сервер.
  • Перед массовым применением протестируйте на резервной копии сайта.
  • Если используете сторонние плагины кэширования, очистите кэш после смены статусов товаров.

Альтернативные варианты и их сравнение

МетодПреимуществаНедостаткиСложность
Изменение статуса товара на draftПростая реализация, стандартный способ скрытияТовар полностью скрывается, невозможно временно показатьНизкая
Использование кастомного поля для отключенияГибко: можно показывать с условиемТребует доработки темы/плагинов для фильтрации товаровСредняя
Отключение через смену видимости (например, private)Товар не видно обычным пользователямМожет влиять на SEO, сложнее управлятьСредняя

Краткий чек-лист для внедрения

  • Выбрать правильный хук для реакции на смену статуса заказа.
  • Написать функцию, которая меняет статус товара на draft.
  • Добавить функцию в functions.php или плагин.
  • Протестировать на тестовом заказе.
  • Проверить отображение товара на сайте.
  • Добавить логи для отладки и мониторинга работы.
Автоматическое удаление спам комментариев в WordPress
21.01.2026
Как создать и использовать собственный виджет в WordPress
11.03.2026
Как избежать конфликтов между WooCommerce и плагинами: как отслеживать и решать
06.05.2026
Как автоматически обновлять миниатюры в WordPress при смене размера изображений
14.03.2026
Как удалить пустые HTML-теги в WordPress
24.03.2026