Диагностика проблемы: почему товары с нулевым остатком остаются активными в WooCommerce
По умолчанию WooCommerce не отключает товары, когда их запас на складе равен нулю. Это приводит к тому, что покупатели видят товары, которые фактически недоступны для заказа, что ухудшает пользовательский опыт и может привести к потерям продаж или негативным отзывам.
Чтобы убедиться, что на вашем сайте есть такая проблема, проверьте настройки WooCommerce в разделе Товары > Запасы. Если опция Разрешать заказы при отсутствии товара включена, товары с нулевым остатком будут доступны для покупки. Однако даже если она отключена, сами товары не деактивируются автоматически.
Пошаговое решение: как автоматически отключать товары при нулевом остатке через код
1. Создаем функцию для проверки остатков и отключения товаров
Добавьте в файл functions.php вашей дочерней темы или в кастомный плагин следующий код:
function wpexperts_auto_disable_out_of_stock_products() {
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => '_stock_status',
'value' => 'instock',
],
],
'fields' => 'ids',
];
$query = new WP_Query($args);
if (!$query->have_posts()) {
return;
}
foreach ($query->posts as $product_id) {
$stock_quantity = get_post_meta($product_id, '_stock', true);
// Если остаток 0 или меньше, отключаем товар
if (intval($stock_quantity) <= 0) {
wp_update_post([
'ID' => $product_id,
'post_status' => 'draft',
]);
}
}
}2. Запускаем функцию по расписанию через Cron WordPress
Чтобы проверка остатков происходила автоматически, создайте кастомное событие Cron.
if (!wp_next_scheduled('wpexperts_daily_stock_check')) {
wp_schedule_event(time(), 'daily', 'wpexperts_daily_stock_check');
}
add_action('wpexperts_daily_stock_check', 'wpexperts_auto_disable_out_of_stock_products');3. Опционально: ручной запуск функции для тестирования
add_action('admin_init', function() {
if (isset($_GET['run_stock_check']) && current_user_can('manage_options')) {
wpexperts_auto_disable_out_of_stock_products();
echo 'Проверка остатков и отключение товаров выполнена';
exit;
}
});После добавления этого кода, вы сможете вручную запустить проверку, добавив в адресную строку админки ?run_stock_check=1.
Проверка результата: как убедиться, что товары отключаются при нулевом остатке
- Перейдите в админ-панель WooCommerce > Товары и отфильтруйте товары со статусом Черновик. Здесь должны появиться товары с нулевым остатком.
- На фронтенде ранее доступные товары с нулевым запасом должны исчезнуть из каталога и не отображаться в поиске.
- Для тестирования вручную измените запас любого товара на 0 и запустите ручной запуск функции (
?run_stock_check=1).
Частые ошибки и как их исправить
- Товары не отключаются после запуска функции
Проверьте, правильно ли работает запрос WP_Query и возвращает ли он товары. Можно вывести результатvar_dump($query->posts)для отладки. - Функция отключает все товары
Ошибка в проверке остатка. Убедитесь, чтоintval($stock_quantity)корректно получает значение. Возможно, у товара нет мета_stock(например, для простых товаров с управлением запасами отключено). - Cron не срабатывает
Убедитесь, что на сайте есть трафик, который запускает WP Cron, или настройте системный cron для вызоваwp-cron.php. - Пользователи видят товары в кэше
Очистите кэш сайта и браузера, если используется плагин кэширования.
Практические советы по безопасности и производительности
- Оптимизация запроса: если у вас тысячи товаров, оптимизируйте выборку, обрабатывая товары порционно (пагинация WP_Query с
posts_per_page100). - Безопасность доступа: ограничьте ручной запуск функции только администраторам.
- Логирование: для отладки добавьте запись в лог отключенных товаров, чтобы отслеживать изменения.
- Обработка вариативных товаров: для вариативных товаров проверяйте остаток каждой вариации через
WC_Product_Variation.
Сравнение решений: код vs плагины
| Критерий | Реализация на коде | Использование плагина | Компромисс |
|---|---|---|---|
| Гибкость | Полный контроль, можно кастомизировать | Готовые настройки, но ограничены функционалом | Требуется знание PHP для поддержки |
| Производительность | Зависит от реализации, можно оптимизировать | Может добавлять лишние запросы | Код требует тестирования на нагрузку |
| Безопасность | Прозрачный код, легче контролировать | Зависит от качества плагина | Плагин может содержать уязвимости |
| Поддержка и обновления | Зависит от разработчика сайта | Обновления и поддержка от автора плагина | Плагин может перестать поддерживаться |