Диагностика проблемы: как понять, что товар нужно отключать автоматически
В интернет-магазинах на WooCommerce часто возникает задача: отключать товары из продажи, когда их запас достигает определённого минимума. Это помогает избежать ситуаций, когда клиент оформляет заказ на товар, которого фактически нет в наличии, и снижает нагрузку на поддержку.
Проверьте текущий статус товара и его количество на складе в админке WooCommerce. Если товар продолжает отображаться в каталоге и в продаже при нулевом или отрицательном остатке, значит автоматизация не настроена.
Как проверить текущий запас и статус товара
global $product;
$stock_quantity = $product->get_stock_quantity();
$is_in_stock = $product->is_in_stock();
error_log("Текущий запас: $stock_quantity, в продаже: " . ($is_in_stock ? 'да' : 'нет'));
Добавьте этот код в шаблон single-product.php или в файл функций, чтобы убедиться, что WooCommerce правильно видит количество и статус товара.
Пошаговое решение: автоматическое отключение товаров по запасу
Основная идея — использовать хук woocommerce_product_set_stock, который вызывается при изменении запаса товара, и при достижении порога автоматически изменять статус товара на «черновик» или «вне продажи».
Код для автоматического отключения товара при запасе 0 и ниже
add_action('woocommerce_product_set_stock', 'auto_disable_product_by_stock', 10, 1);
function auto_disable_product_by_stock($product) {
$stock_quantity = $product->get_stock_quantity();
// Установите порог отключения
$threshold = 0;
if ($stock_quantity <= $threshold) {
// Меняем статус на 'outofstock'
$product->set_stock_status('outofstock');
$product->save();
} else {
// Если запас восстановлен, возвращаем статус 'instock'
$product->set_stock_status('instock');
$product->save();
}
}
Этот код автоматически меняет статус товара на «нет в наличии» при нулевом или отрицательном запасе, что исключает возможность покупки.
Как автоматически скрывать товары из каталога
Если нужно полностью скрыть такие товары из каталога, можно менять статус публикации:
add_action('woocommerce_product_set_stock', 'auto_hide_product_by_stock', 10, 1);
function auto_hide_product_by_stock($product) {
$stock_quantity = $product->get_stock_quantity();
$threshold = 0;
$post_id = $product->get_id();
if ($stock_quantity <= $threshold) {
// Снимаем с публикации
wp_update_post([
'ID' => $post_id,
'post_status' => 'draft'
]);
} else {
// Возвращаем в публикацию
wp_update_post([
'ID' => $post_id,
'post_status' => 'publish'
]);
}
}
Проверка результата после внедрения
1. Измените количество товара в административной панели WooCommerce на 0 и ниже.
2. Проверьте, что товар статус изменился на «нет в наличии» или стал черновиком (в зависимости от выбранного варианта).
3. Обновите страницу каталога и страницы товара на сайте — товар должен быть недоступен для покупки или скрыт.
4. Восстановите запас товара выше порога и убедитесь, что товар снова доступен для покупки или опубликован.
Частые ошибки и как их исправить
- Код не работает после обновления запаса: Проверьте, что используете правильный хук
woocommerce_product_set_stockи что ваш код не конфликтует с другими плагинами управления запасами. - Товар остаётся в продаже при 0 запасе: Возможно, в настройках WooCommerce включена опция «Разрешить заказы в отсутствии товара» (Backorders). Перейдите в WooCommerce > Настройки > Товары > Запасы и отключите её.
- Изменение статуса товара на черновик вызывает проблемы с SEO: Рассмотрите вариант только смены статуса на
outofstockвместо изменения публикации, чтобы сохранить URL и SEO. - Кэширование не позволяет увидеть изменения сразу: Очистите кэш сайта и браузера, либо временно отключите кэш-плагины для теста.
Практические советы по безопасности и производительности
- Используйте минимально необходимый код и избегайте изменения статуса публикации, если не уверены, что это не повредит SEO.
- Проверяйте совместимость с плагинами для управления запасами и сторонними расширениями WooCommerce.
- Если на сайте много товаров и частые изменения запасов, добавьте ограничение на вызов функции, чтобы избежать лишних запросов к базе данных.
- Для больших магазинов рекомендуется использовать cron-задачи или сторонние сервисы для управления статусами товаров, а не хук на изменение запаса.
Сравнение вариантов решения
| Вариант | Описание | Плюсы | Минусы |
|---|---|---|---|
| Изменение статуса запаса (stock_status) | Товары меняют статус на «нет в наличии» | Простая реализация, сохраняется URL, SEO не страдает | Товар виден, но нельзя купить — может путать клиентов |
| Изменение статуса публикации (post_status) | Товар становится черновиком и скрывается с сайта | Полностью скрывает товар, нет путаницы для клиентов | Может повредить SEO и ссылки, требуется дополнительное управление |
| Использование плагинов (например, Clearfy Pro) | Автоматизация с расширенными настройками и отчётами | Удобство, поддержка, дополнительные функции | Дополнительная нагрузка, необходимость обновлений, стоимость |
Подробные инструкции и примеры кода помогут адаптировать решение под конкретный магазин. Для дополнительной оптимизации и безопасности можно рассмотреть плагины из Clearfy Pro, которые упрощают управление дублирующимися товарами и статусами.