Диагностика проблемы: почему автоматическое отключение товаров важно
В интернет-магазинах на WooCommerce часто возникает ситуация, когда товары заканчиваются на складе, но остаются доступными для покупки. Это приводит к отменам заказов, негативным отзывам и потере доверия клиентов. Стандартные настройки WooCommerce позволяют скрывать товары без запасов, но это не всегда удобно, особенно если товар временно отсутствует и скоро будет пополнен.
Задача – автоматически переключать статус товара на "черновик" или "скрытый" при отсутствии остатков и при этом сохранять возможность быстро вернуть товар в продажу, когда запасы появятся.
Как проверить, что автоматическое отключение товаров не работает
- Откройте страницу товара с нулевым запасом и проверьте, отображается ли он в каталоге.
- Перейдите в админке WooCommerce — Товары — и посмотрите статус товара (опубликован/черновик).
- Проверьте, обновляются ли статусы товара после изменения остатка на складе.
Пошаговое решение: автоматизация статуса товара через хук WooCommerce
Используем хук woocommerce_product_set_stock, который срабатывает при обновлении остатков товара. Добавим функцию, которая проверит остаток и изменит статус товара.
add_action('woocommerce_product_set_stock', 'wpdemo_auto_disable_product_on_out_of_stock', 10, 1);
function wpdemo_auto_disable_product_on_out_of_stock($product) {
if ( ! $product instanceof WC_Product ) {
return;
}
$stock_quantity = $product->get_stock_quantity();
$post_id = $product->get_id();
// Проверяем, есть ли остаток
if ($stock_quantity <= 0) {
// Если товар опубликован, переводим его в черновик
if (get_post_status($post_id) === 'publish') {
wp_update_post([
'ID' => $post_id,
'post_status' => 'draft'
]);
}
} else {
// Если товар есть в наличии и статус не опубликован, возвращаем публикацию
if (get_post_status($post_id) !== 'publish') {
wp_update_post([
'ID' => $post_id,
'post_status' => 'publish'
]);
}
}
}Данный код автоматически переключает статус товара в "черновик" при отсутствии остатков и обратно в "опубликован" при появлении запасов.
Оптимизация: чтобы код работал только для продуктов с учетом управления запасами
if ( ! $product->managing_stock() ) {
return;
}Добавьте эту проверку в начало функции, чтобы избежать лишних операций для товаров без управления запасами.
Проверка результата после внедрения
- В админке измените количество товара на 0 и сохраните.
- Перейдите к списку товаров и убедитесь, что нужный товар стал черновиком и исчез из каталога.
- Увеличьте остаток товара больше 0, сохраните.
- Проверьте, что статус товара снова стал опубликован и он отображается в каталоге.
Частые ошибки и как их исправить
- Код не срабатывает при обновлении остатка через сторонние импортеры: Некоторые импортеры напрямую меняют записи в базе без вызова хуков WooCommerce. Решение: запустить скрипт массовой проверки остатков и обновления статусов вручную или через WP-CLI.
- Товар исчезает, но не появляется обратно при пополнении: Проверьте, что функция возвращает статус в "publish" при запасах > 0. Ошибка часто в логике условия.
- Конфликты с другими плагинами, которые управляют статусами: Проверьте очередность действий и при необходимости используйте приоритеты в add_action (например, 20 вместо 10).
Практические советы для безопасности и производительности
- Не используйте тяжелые SQL-запросы внутри функции. Воспользуйтесь встроенными методами WC_Product и WP_Post.
- Добавьте проверку
managing_stock()для исключения лишних операций. - Для массовых обновлений запасов используйте WP-CLI или крон-задачи, чтобы не тормозить работу сайта.
- Резервное копирование базы данных перед внедрением автоматизации — обязательное условие.
Сравнение способов реализации автоматического отключения товара
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
Использование хука woocommerce_product_set_stock | Автоматизация в реальном времени; легкая реализация; не требует сторонних плагинов | Не срабатывает при прямом изменении БД; зависит от WooCommerce API | Добавить периодическую проверку WP-CLI для синхронизации |
| Использование сторонних плагинов для управления статусами | Готовые решения; часто с настройками UI | Могут нагружать сайт; не всегда гибкие; риск конфликтов | Использовать вместе с кастомным кодом для точной логики |
| Массовое обновление через WP-CLI скрипт | Высокая производительность; подходит для больших магазинов | Требует знаний консоли; не подходит для реального времени | Комбинировать с хуками для оперативного обновления |