Диагностика проблемы с отсутствием товара в WooCommerce
Часто владельцы интернет-магазинов сталкиваются с проблемой, когда товары, которых нет в наличии, продолжают отображаться на сайте и доступны к покупке. Это приводит к неудобствам для покупателей и увеличивает количество отмененных заказов.
Задача — автоматически отключать товары при отсутствии стока и при этом позволять быстро их восстановить в интерфейсе администратора без ручного поиска товара.
Пошаговое решение: автоматическое отключение и восстановление товаров
1. Автоматическая смена статуса товара при нулевом или отрицательном остатке
Реализуем функцию, которая будет срабатывать при сохранении товара и проверять наличие на складе. Если запас равен или меньше нуля, товар меняет статус на "черновик" (draft), что отключит его из видимости на сайте.
add_action('save_post_product', 'auto_disable_out_of_stock_product', 20, 3);
function auto_disable_out_of_stock_product($post_ID, $post, $update) {
// Проверяем, что это продукт
if ($post->post_type !== 'product') return;
// Получаем объект товара
$product = wc_get_product($post_ID);
if (!$product) return;
// Проверяем управление запасами
if (!$product->managing_stock()) return;
$stock_quantity = $product->get_stock_quantity();
// Если товара нет в наличии или запас <= 0, переводим в черновик
if ($stock_quantity <= 0 && $product->is_purchasable()) {
// Обновляем статус
wp_update_post([
'ID' => $post_ID,
'post_status' => 'draft'
]);
}
}
2. Восстановление товара при увеличении количества на складе
Добавим обработчик, который при увеличении количества товара выше 0 переводит его обратно в статус "опубликовано" (publish), если он был в черновиках.
add_action('woocommerce_update_product', 'auto_enable_product_if_in_stock', 20);
function auto_enable_product_if_in_stock($product) {
if (!$product instanceof WC_Product) return;
if (!$product->managing_stock()) return;
$stock_quantity = $product->get_stock_quantity();
$post_status = get_post_status($product->get_id());
if ($stock_quantity > 0 && $post_status === 'draft') {
wp_update_post([
'ID' => $product->get_id(),
'post_status' => 'publish'
]);
}
}
Проверка результата после внедрения кода
- Создайте тестовый товар с управлением запасами и установите количество в 5.
- Проверьте, что товар опубликован и доступен на сайте.
- Измените количество на 0 и сохраните товар.
- Проверьте в админке, что статус товара автоматически сменился на "черновик" и товар исчез из каталога на фронтенде.
- Увеличьте количество товара до 3 и сохраните.
- Убедитесь, что статус товара вернулся в "опубликовано" и товар снова доступен покупателям.
Частые ошибки и их исправление
- Функция не срабатывает при обновлении товара: Проверьте, что хуки подключены правильно и что сохранение товара происходит через стандартный интерфейс WordPress. При массовом импорте или обновлении через API может потребоваться дополнительная логика.
- Товар не меняет статус: Убедитесь, что у пользователя, выполняющего изменения, есть права на редактирование и изменение статуса товаров.
- Продукт с вариациями не обрабатывается корректно: Для вариативных товаров нужно дополнительно обрабатывать вариации, так как у них собственные запасы. В код выше можно добавить цикл по вариациям.
- Проблемы с кэшированием: Кэш страниц или плагинов может задерживать обновление статуса. Очистите кэш после изменений.
Практические советы по безопасности и производительности
- Используйте
wp_update_postаккуратно, так как при сохранении товара этот хук может вызываться рекурсивно. В данном случае риски минимальны, но если добавите сложную логику, добавьте флаг предотвращения повторного выполнения. - Для больших магазинов с тысячами товаров лучше переносить подобные проверки в фоновые задачи (cron), чтобы не нагружать процесс сохранения.
- Резервное копирование перед внедрением кода — обязательное условие. Рекомендуется использовать проверенные плагины, например, UpdraftPlus.
Таблица сравнения вариантов реализации автоматического отключения товара
| Вариант | Плюсы | Минусы | Примечание |
|---|---|---|---|
| Код на хуках save_post и woocommerce_update_product | Быстрая реакция, автоматизация, без плагинов | Риск рекурсии, нагрузка при массовом обновлении | Подходит для магазинов малого и среднего размера |
| Плагин для управления запасами и статусами | Простота использования, поддержка | Может быть платным, нагрузка плагина | Рекомендуется для крупных магазинов |
| Фоновый скрипт на cron для проверки остатков | Минимальная нагрузка на сохранение товара | Задержка в обновлении статуса, сложность реализации | Для магазинов с большим количеством товаров |