В чем суть задачи автоматического отключения товаров в WooCommerce
Иногда необходимо, чтобы товар автоматически становился "недоступным" (выключался) после того, как он был продан — например, при продаже уникальных товаров или ограниченных партий. Это позволит избежать ситуации, когда покупатель оформляет заказ на товар, который уже распродан.
WooCommerce по умолчанию не отключает товары после продажи, это нужно реализовать самостоятельно через хуки и функцию обновления статуса товара.
Диагностика проблемы
Проверьте, что в вашем магазине не реализована автоматическая блокировка товара после первой успешной продажи. Это можно сделать так:
- Оформите тестовый заказ на товар с количеством 1;
- Завершите оплату;
- Проверьте, доступен ли товар для покупки вновь;
- Если товар доступен, значит автоматическое отключение не работает.
Также убедитесь, что в настройках WooCommerce нет плагинов или кастомных функций, которые влияют на статус товара после продажи.
Пошаговое решение: автоматическое отключение товара после продажи
Реализуем функцию, которая после успешной оплаты заказа проверит количество товара и, если остаток равен нулю, сменит статус товара на "черновик" или "вне продажи".
1. Добавляем код в functions.php вашей темы или в кастомный плагин
add_action('woocommerce_order_status_completed', 'auto_disable_product_after_sale');
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_id => $item ) {
$product_id = $item->get_product_id();
$product = wc_get_product( $product_id );
if ( ! $product || ! $product->managing_stock() ) continue;
$stock_quantity = $product->get_stock_quantity();
// Если остаток равен 0 или меньше
if ( $stock_quantity <= 0 ) {
// Меняем статус товара на черновик
$product_post = [
'ID' => $product_id,
'post_status' => 'draft',
];
wp_update_post( $product_post );
}
}
}Этот код отслеживает событие смены статуса заказа на "завершен" (completed), перебирает все товары в заказе, проверяет остаток на складе и если он нулевой или отрицательный, меняет статус товара на "черновик".
2. Кастомизация под нужный статус
Вместо "draft" можно использовать статус "private" или пользовательский статус, в зависимости от ваших задач.
Проверка результата
- Создайте товар с количеством 1;
- Оформите заказ и доведите его до статуса "завершен";
- Обновите страницу товара в админке — статус должен смениться на "черновик";
- Попробуйте открыть страницу товара на сайте — он должен быть недоступен для покупателей.
Частые ошибки и как их исправить
- Статус заказа не "completed": В некоторых магазинах используется другой статус, например, "processing". В этом случае замените хук на
woocommerce_order_status_processingили добавьте дополнительный хук. - У товара не включено управление запасами: Если у товара не включено управление складом (manage stock), функция пропустит его, нужно включить управление запасами в настройках товара.
- Кэширование мешает обновлению статуса: Очистите кэш сайта и браузера после обновления кода.
- Изменение статуса товара не применяется: Проверьте, что пользователь, под которым выполняется код, имеет права на редактирование постов.
Практические советы по безопасности и производительности
- Не вставляйте код напрямую в
functions.phpв публичных темах — лучше использовать дочернюю тему или собственный небольшой плагин. - Добавьте проверку nonce и прав пользователя, если планируете расширять функционал для админ-панели.
- Если в магазине много заказов и товаров, используйте transient cache для оптимизации запросов stock_quantity.
- Периодически проверяйте логи ошибок сервера для выявления проблем с хуками.
Сравнение способов реализации автоматического отключения товара
| Вариант | Плюсы | Минусы | Сложность |
|---|---|---|---|
Код через хук woocommerce_order_status_completed | Быстрая кастомизация, нет плагинов | Требует навыков PHP, возможны ошибки | Средняя |
| Плагин автоматического управления запасами | Простота установки, готовый функционал | Может быть избыточным, нагрузка | Низкая |
| Ручное отключение товара после продажи | Максимальный контроль | Ручной труд, риск ошибки | Низкая |