В чем проблема с товарами при нулевом остатке в WooCommerce
Многие владельцы интернет-магазинов на WooCommerce сталкиваются с ситуацией, когда товары с нулевым остатком продолжают отображаться на сайте и доступны для заказа, что приводит к неудобствам и потерям. Автоматическое отключение таких товаров поможет избежать ошибок при продаже и улучшить пользовательский опыт.
Диагностика текущего состояния товаров с нулевым остатком
Для начала необходимо понять, как WooCommerce обрабатывает остатки и статус товаров:
- Проверить, включен ли учет остатков (Inventory Management) в настройках WooCommerce.
- Выяснить, как настроено поведение при нулевом остатке — разрешены ли заказы при отсутствии товара.
- Определить, какие товары имеют нулевой остаток и не отключены вручную.
Диагностика через админку:
WooCommerce → Товары → Фильтр → Наличие — "Нет в наличии"Для проверки через базу данных можно использовать SQL-запрос:
SELECT p.ID, p.post_title, pm.meta_value as stock_quantity
FROM wp_posts p
JOIN wp_postmeta pm ON p.ID = pm.post_id AND pm.meta_key = '_stock'
WHERE p.post_type = 'product' AND pm.meta_value <= 0 AND p.post_status = 'publish';Пошаговое решение: автоматическое отключение товаров с нулевым остатком
1. Отключаем возможность заказа при нулевом остатке
Для этого в WooCommerce в настройках управления запасами снимите галочку с "Разрешить заказы при отсутствии товара" (Allow backorders — установите значение "Нет"). Это предотвратит оформление заказов на отсутствующие товары.
2. Автоматически изменяем статус товара на «Черновик» или «В архиве» при достижении нулевого остатка
Добавьте следующий код в файл functions.php вашей темы или в кастомный плагин:
add_action('woocommerce_reduce_order_stock', 'auto_disable_out_of_stock_products', 10, 1);
function auto_disable_out_of_stock_products( $order ) {
foreach ( $order->get_items() as $item ) {
$product = $item->get_product();
if ( ! $product || $product->get_manage_stock() === false ) {
continue;
}
$stock_quantity = $product->get_stock_quantity();
if ( $stock_quantity <= 0 ) {
// Меняем статус на черновик
$post = [
'ID' => $product->get_id(),
'post_status' => 'draft',
];
wp_update_post( $post );
}
}
}Этот код срабатывает после уменьшения запасов при оформлении заказа и отключает товары с нулевым остатком.
3. Плановое обновление статуса товаров с нулевым остатком
Для надежности можно добавить CRON-задачу, которая раз в сутки проверяет запасы и отключает товары с 0 или меньше единиц на складе:
add_action('wp', function() {
if (!wp_next_scheduled('auto_disable_out_of_stock_cron')) {
wp_schedule_event(time(), 'daily', 'auto_disable_out_of_stock_cron');
}
});
add_action('auto_disable_out_of_stock_cron', function() {
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'post_status' => 'publish'
];
$query = new WP_Query($args);
foreach ($query->posts as $post) {
$stock = (int) get_post_meta($post->ID, '_stock', true);
$manage_stock = get_post_meta($post->ID, '_manage_stock', true);
if ($manage_stock === 'yes' && $stock <= 0) {
wp_update_post([
'ID' => $post->ID,
'post_status' => 'draft',
]);
}
}
});Проверка результата после внедрения
- Создайте тестовый заказ на товар с небольшим остатком, чтобы довести его до нуля.
- После оформления заказа и обновления статуса проверьте, что товар стал черновиком и исчез из каталога.
- Для CRON-проверки можно вручную запустить событие через WP-CLI или плагин WP Crontrol и убедиться, что товары с нулевым остатком отключаются.
Частые ошибки и как их исправить
- Товар не отключается после достижения нулевого остатка: проверьте, что у товара включено управление запасами (
_manage_stock= 'yes'). - Товар остается видимым, но нельзя заказать: убедитесь, что в настройках WooCommerce не разрешены предзаказы (backorders).
- CRON-задача не срабатывает: проверьте, активен ли WP-Cron и нет ли конфликтов с плагинами кэширования или ограничениями хостинга.
- Код вызывает ошибки PHP: проверьте совместимость с версией WooCommerce и активной темой, а также правильность синтаксиса.
Практические советы по безопасности и производительности
- Используйте кеширование запросов WP_Query при большом количестве товаров, чтобы снизить нагрузку на базу данных.
- Отдавайте предпочтение изменению статуса товара на
draft, а не удалению, чтобы сохранить историю и статистику. - Для контроля логики работы CRON-задачи используйте плагин WP Crontrol, чтобы отслеживать и запускать задачи вручную.
- Регулярно делайте резервные копии базы данных перед внесением изменений или добавлением кастомного кода.
Сравнение вариантов реализации автоматического отключения товаров
| Метод | Плюсы | Минусы |
|---|---|---|
| Плагины (например, Stock Manager) | Простота установки, готовый функционал, поддержка обновлений | Нагрузка на сайт, зависимость от стороннего кода, возможные конфликты |
| Код в functions.php (как в статье) | Максимальный контроль, отсутствие лишних плагинов, оптимизация под задачи | Требует навыков программирования, риск ошибок при неправильном коде |
| Ручное изменение статусов | Полный контроль, никакого кода | Трудозатратно, легко забыть, не подходит для больших магазинов |