Проблема: необходимость скрывать товары после завершения продаж
В WooCommerce часто возникает задача автоматически деактивировать товары, когда их количество в запасе достигает нуля, чтобы избежать недоразумений с покупателями и поддерживать актуальность каталога. Ручное управление — утомительно и ошибочно, особенно при большом ассортименте.
Диагностика проблемы
Чтобы понять, работает ли автоматическое отключение, проверьте настройки управления запасами и статус товара:
- В админке WordPress откройте карточку товара.
- Перейдите на вкладку Инвентарь и убедитесь, что включено управление запасами (
Manage stock?должно быть отмечено). - Проверьте текущий остаток (
Stock quantity). - Обратите внимание, что при достижении нуля статус товара обычно меняется на
Out of stock, но сам товар остаётся опубликованным и видимым.
Это приводит к тому, что товар отображается в каталоге и может сбивать с толку покупателей.
Решение: автоматическое изменение статуса товара при нулевом запасе
Для отключения товара после окончания запасов добавим кастомный код, который будет менять статус публикации товара на draft при достижении количества 0. Код можно добавить в файл functions.php вашей темы или использовать плагин для пользовательских сниппетов.
Пример кода для автоматического отключения товара
add_action('woocommerce_product_set_stock', 'auto_draft_product_when_out_of_stock', 10, 1);
function auto_draft_product_when_out_of_stock( $product ) {
if ( ! $product->managing_stock() ) {
return; // Управление запасом отключено
}
$stock = $product->get_stock_quantity();
$status = $product->get_status();
if ( $stock !== null && $stock <= 0 && $status !== 'draft' ) {
$product->set_status('draft');
$product->save();
} elseif ( $stock > 0 && $status === 'draft' ) {
$product->set_status('publish');
$product->save();
}
}Этот хук woocommerce_product_set_stock срабатывает при обновлении запасов товара. Если количество становится 0 или меньше, статус меняется на draft (товар скрывается). При пополнении запаса статус возвращается в publish.
Альтернативный вариант: изменение статуса на "Out of stock" без скрытия
Если не хотите скрывать товар, а только показывать, что он отсутствует, убедитесь, что в настройках WooCommerce включена опция "Скрывать отсутствующие товары из каталога" (WooCommerce > Настройки > Товары > Запасы). Но этот метод не всегда удобен для SEO и пользовательского опыта.
Проверка результата после внедрения
- Обновите запас товара до 0 через админку или программно.
- Обновите страницу товара на сайте — товар должен исчезнуть из каталога и стать недоступным.
- Повторно увеличьте запас — товар должен снова появиться в каталоге.
- Проверьте логи ошибок и убедитесь, что не возникает предупреждений PHP.
Частые ошибки и их устранение
- Код не срабатывает при обновлении запасов через импорт или сторонние плагины. Проверяйте, что сторонние инструменты триггерят хук
woocommerce_product_set_stock. Если нет, используйте хукsave_post_productс дополнительной логикой. - Товар не возвращается в публикацию при пополнении запаса. Проверьте, что условие на увеличение запаса прописано правильно (в коде выше это учитывается).
- Потеря SEO-рейтинга после смены статуса на draft. Рассмотрите альтернативу с мета-robots или редиректами, если критично сохранить страницы в индексе.
- Конфликт с кэшированием. Очистите кэш сайта и браузера после применения изменений.
Практические советы по безопасности и производительности
- Добавляйте код в дочернюю тему или отдельный плагин, чтобы изменения не потерялись при обновлении.
- Не используйте тяжелые циклы и запросы внутри хуков изменения запаса, чтобы не замедлять процесс обновления.
- Для больших магазинов с тысячами товаров рассмотрите пакетную обработку статусов через WP-CLI.
- Регулярно проверяйте логи ошибок для своевременного обнаружения проблем.
Сравнение вариантов автоматического отключения товаров
| Метод | Плюсы | Минусы | Код/Плагин |
|---|---|---|---|
Изменение статуса на draft (код) | Полное скрытие, контроль статуса | Потеря SEO, требуется код | Пример из статьи |
| Настройка WooCommerce "Скрывать отсутствующие товары" | Простота, без кода | Товар остается опубликован, влияет на видимость | Встроенная настройка WooCommerce |
| Плагины управления запасами и видимостью | Доп. функции и удобство | Может замедлять сайт, зависит от плагина | WooCommerce Stock Manager и др. |