Диагностика задачи: зачем менять статус наличия товара автоматически
В интернет-магазинах на WooCommerce часто требуется обновлять статус наличия товара сразу после того, как заказ оплачен. Особенно это актуально при ручном управлении складом, товарах с ограниченным количеством или при поставках под заказ. Если этого не делать, товар может оставаться доступным для покупки, хотя его физически больше нет в наличии.
Без автоматического обновления есть риск:
- продажи товаров, которых нет на складе;
- недовольство клиентов из-за отмен заказов;
- ошибки в учете складских остатков.
Как отследить успешную оплату заказа в WooCommerce
Для автоматизации нужно поймать момент, когда заказ переходит в статус processing или completed. Это значит, что оплата прошла успешно.
Для этого используется хук woocommerce_order_status_changed. Он срабатывает при изменении статуса заказа и передает старый и новый статусы, а также объект заказа.
Пример базового кода для отлова изменения статуса
add_action('woocommerce_order_status_changed', 'custom_update_product_stock_on_paid', 10, 4);
function custom_update_product_stock_on_paid($order_id, $old_status, $new_status, $order) {
if ( in_array($new_status, array('processing', 'completed')) ) {
// Логика обновления наличия
}
}Пошаговое решение: автоматическая установка товара в "нет в наличии" после оплаты
Задача: после успешной оплаты перевести товары из заказа в статус "нет в наличии" (outofstock). Пример решения:
- Подключаемся к хуку
woocommerce_order_status_changedдля отслеживания оплаты. - Извлекаем товары из заказа вместе с их ID.
- Для каждого товара обновляем поле
stock_statusнаoutofstock. - Обновляем кэш и вызываем функции WooCommerce для пересчёта запасов.
Код для автоматизации
add_action('woocommerce_order_status_changed', 'wc_set_products_outofstock_after_payment', 10, 4);
function wc_set_products_outofstock_after_payment($order_id, $old_status, $new_status, $order) {
if ( ! in_array($new_status, array('processing', 'completed')) ) {
return;
}
if ( ! $order instanceof WC_Order ) {
$order = wc_get_order($order_id);
}
foreach ( $order->get_items() as $item ) {
$product = $item->get_product();
if ( $product && $product->managing_stock() ) {
$product->set_stock_status('outofstock');
$product->save();
}
}
}Проверка результата после внедрения
- Создайте тестовый заказ с оплачиваемым товаром, у которого на складе есть запас.
- Переведите заказ в статус
processingвручную или через оплату. - Перейдите в админку WooCommerce — Товары и проверьте статус товара. Он должен измениться на "Нет в наличии".
- Попробуйте добавить этот товар в корзину — должно быть невозможно из-за отсутствия наличия.
Частые ошибки и способы их устранения
- Не срабатывает обновление статуса товара
Проверьте, что хук подключен и функция вызывается. Для отладки добавьтеerror_log()внутри функции. - Обновляется не тот товар
Убедитесь, что вы получаете объект WC_Product через$item->get_product(), а не ID товара напрямую. - Не учитываются вариации
Для вариативных товаров убедитесь, что обновляете статус вариации, а не родительского товара. - Проблемы с кешированием
Если используется кеширование WooCommerce или плагинов, очистите кеш после обновления товара.
Практические советы по безопасности и производительности
- Добавляйте проверку прав пользователя, если используете функции в админке.
- Не обновляйте товары без необходимости — например, делайте проверку текущего статуса перед изменением.
- Если товаров в заказе много, выполняйте обновления пакетно или с ограничением времени выполнения.
- Для массового обновления статусов используйте WP-CLI, если это подходит.
Сравнение подходов: код vs плагины
| Метод | Плюсы | Минусы | Примеры |
|---|---|---|---|
| Ручной код в functions.php | Полный контроль, нет зависимостей | Требует навыков, ошибки влияют на работу сайта | Пример из статьи |
| Плагины управления складом | Готовый функционал, поддержка | Может грузить сайт, платные версии | WooCommerce Stock Manager, ATUM Inventory |
| Внешние сервисы с синхронизацией | Автоматизация, интеграция с 1С и CRM | Сложная настройка, стоимость | Zapier, интеграции с ERP |