Диагностика проблемы: почему нужно отключать товары после окончания продаж
В интернет-магазинах на WooCommerce часто возникает ситуация, когда товар заканчивается и его нужно временно скрыть или перевести в статус "неактивный". Если этого не сделать, покупатели могут пытаться заказать товар, которого нет в наличии, что приводит к недовольству и возвратам. Автоматизация этого процесса сэкономит время и исключит ошибки.
Как определить окончание продаж товара в WooCommerce
Основной индикатор — количество товара на складе. WooCommerce хранит этот параметр в мета-данных товара (_stock). Если у товара включено управление запасами (manage_stock = yes), то при достижении _stock = 0 необходимо сменить статус товара.
Стандартно WooCommerce имеет статус "В наличии" и "Нет в наличии", но статус публикации товара (post_status) остается publish. Чтобы товар не отображался в каталоге, нужно изменить статус публикации на draft или private.
Пошаговое решение: автоматическое отключение товара при 0 на складе
Реализуем функцию на PHP, которая будет срабатывать при изменении количества товара и менять статус публикации.
1. Добавляем хук на сохранение товара
add_action('woocommerce_product_set_stock', 'auto_disable_product_when_out_of_stock', 10, 1);2. Функция проверки и изменения статуса
function auto_disable_product_when_out_of_stock($product) {
if (!$product instanceof WC_Product) {
$product = wc_get_product($product);
}
if (!$product->managing_stock()) {
return; // Управление запасами не включено
}
$stock_quantity = $product->get_stock_quantity();
$post_id = $product->get_id();
if ($stock_quantity === 0) {
// Отключаем товар
$post = get_post($post_id);
if ($post && $post->post_status !== 'draft') {
wp_update_post([
'ID' => $post_id,
'post_status' => 'draft',
]);
}
} elseif ($stock_quantity > 0) {
// Включаем товар обратно, если он был отключен
$post = get_post($post_id);
if ($post && $post->post_status === 'draft') {
wp_update_post([
'ID' => $post_id,
'post_status' => 'publish',
]);
}
}
}3. Кэш и индексирование
Если на сайте включено кэширование, после изменения статуса товара может потребоваться очистить кэш, чтобы изменения отобразились на фронтенде.
Проверка результата после внедрения решения
- Создайте тестовый товар с включённым управлением запасами.
- Установите количество товара больше нуля и проверьте, что товар виден на сайте.
- Уменьшите количество товара до нуля через админку WooCommerce.
- Обновите страницу каталога — товар должен исчезнуть (статус изменился на draft).
- Увеличьте запас товара обратно — товар должен снова появиться.
Частые ошибки и как их исправить
- Хук не срабатывает: Проверьте, что вы используете
woocommerce_product_set_stock, который вызывается при изменении количества через админку или программно. Если изменение происходит другим способом, используйтеsave_post_productс проверкой_stock. - Товар не скрывается: Убедитесь, что управление запасами включено для товара (
manage_stock = true). - Кэш не обновляется: Очистите кэш сайта и браузера после изменения статуса товара.
- Неправильный статус публикации: Используйте
draftилиprivate, чтобы товар не отображался. Статусpendingилиtrashмогут привести к нежелательным эффектам.
Практические советы по безопасности и производительности
- Не выполняйте тяжелые операции внутри функции хука — изменение статуса товара должно быть максимально легким.
- Проверяйте тип объекта
$productи существование поста перед вызовомwp_update_post, чтобы избежать ошибок. - Если магазин большой, рассмотрите периодическую проверку запасов через WP-Cron вместо хука, чтобы снизить нагрузку.
- Используйте плагины кэширования с возможностью автоматической очистки кэша при изменении контента.
Сравнение вариантов реализации автоматического отключения товаров
| Способ | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
Хук woocommerce_product_set_stock | Мгновенное срабатывание, простота | Не ловит все способы изменения запаса | Использовать для админских изменений |
Хук save_post_product с проверкой _stock | Работает при любых сохранениях товара | Может срабатывать лишний раз, требует оптимизации | Подходит для комплексных проверок |
| WP-Cron периодический скрипт | Снижает нагрузку, контролируемые проверки | Задержка обновления статуса | Для больших магазинов с большим количеством товаров |