Диагностика проблемы: почему важно отключать товары без запаса
В интернет-магазине на WooCommerce товары с нулевым запасом могут приводить к негативному опыту покупателей: они видят товар, который нельзя купить, что снижает конверсию и увеличивает количество обращений в поддержку.
Ручное отключение таких товаров неудобно при большом каталоге. Автоматизация процесса с помощью кода позволяет поддерживать актуальный ассортимент без дополнительного вмешательства.
Пошаговое решение: как автоматически отключать товары без запаса
Подключение к хуку обновления запасов
Необходимо использовать хук WooCommerce woocommerce_product_set_stock, который вызывается при изменении количества товара на складе.
Пример кода для автоматического отключения товара
add_action('woocommerce_product_set_stock', 'auto_disable_product_if_out_of_stock', 10, 1);
function auto_disable_product_if_out_of_stock($product) {
if (!$product instanceof WC_Product) {
return;
}
$stock_quantity = $product->get_stock_quantity();
if ($stock_quantity === 0) {
$product->set_catalog_visibility('hidden');
$product->set_status('draft');
$product->save();
} elseif ($stock_quantity > 0) {
// Если товар снова в наличии, можно вернуть статус опубликованным
if ($product->get_status() === 'draft') {
$product->set_status('publish');
$product->set_catalog_visibility('visible');
$product->save();
}
}
}Этот код автоматически переводит товар в черновик и скрывает его из каталога при достижении нулевого запаса, и возвращает товар в активное состояние при появлении запаса.
Добавление планового сканирования для массовой проверки
Если на сайте часто меняется склад или есть внешние импорты, полезно настроить периодическую проверку всех товаров:
add_action('wp', 'schedule_stock_check_event');
function schedule_stock_check_event() {
if (!wp_next_scheduled('check_all_products_stock')) {
wp_schedule_event(time(), 'hourly', 'check_all_products_stock');
}
}
add_action('check_all_products_stock', 'check_and_disable_out_of_stock_products');
function check_and_disable_out_of_stock_products() {
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'post_status' => ['publish', 'draft'],
'fields' => 'ids',
];
$products = get_posts($args);
foreach ($products as $product_id) {
$product = wc_get_product($product_id);
if (!$product) {
continue;
}
$stock = $product->get_stock_quantity();
if ($stock === 0) {
if ($product->get_status() !== 'draft') {
$product->set_status('draft');
$product->set_catalog_visibility('hidden');
$product->save();
}
} else {
if ($product->get_status() === 'draft') {
$product->set_status('publish');
$product->set_catalog_visibility('visible');
$product->save();
}
}
}
}Проверка результата после внедрения
- Обновите запас любого товара до 0 через админку WooCommerce и проверьте, что товар автоматически стал недоступен на сайте (пропал из каталога и статус стал Draft).
- Пополните запас товара — он должен автоматически вернуться в публикацию и отображаться в каталоге.
- Для массовой проверки запустите wp_cron вручную или дождитесь планового запуска и проверьте, что все товары с нулевым запасом скрыты.
Частые ошибки и как их исправить
- Хук не срабатывает при импорте товаров. Импортеры могут обновлять базу напрямую, минуя хуки WooCommerce. Для решения используйте плановое сканирование с WP-Cron.
- Товар не скрывается, хотя запас 0. Проверьте, что у товара включён учёт запасов (
$product->get_manage_stock()возвращает true). Если нет — код не сработает. - Статус товара меняется, но товар остаётся видимым. Убедитесь, что вы меняете и
catalog_visibility, чтобы скрыть товар из каталога и поиска. - Проблемы с производительностью при массовой проверке. Если товаров много, разбейте выборку на партии (
posts_per_page) и используйте пагинацию.
Практические советы по безопасности и производительности
- Добавляйте фильтрацию и проверку прав пользователя, если запускаете функции из админки.
- Планируйте массовые операции на часы с минимальной нагрузкой.
- Используйте transient API или кеширование для снижения нагрузки при частых проверках.
- Тестируйте на staging-сайте перед применением на боевом.
Сравнение вариантов реализации автоматического отключения товаров
| Способ | Преимущества | Недостатки |
|---|---|---|
Использование хука woocommerce_product_set_stock | Мгновенное реагирование на изменения, минимальная нагрузка | Не срабатывает при массовом импорте или обновлении базы напрямую |
| Плановое сканирование через WP-Cron | Обрабатывает все товары, ловит изменения из любых источников | Нагрузка при больших каталогах, задержка обновления до запуска cron |
| Использование плагинов для управления запасом | Готовое решение, часто с дополнительными функциями | Зависимость от стороннего кода, возможные конфликты и нагрузка |