Диагностика проблемы отсутствия товаров в наличии
В интернет-магазинах на WooCommerce часто возникает задача автоматически скрывать или отключать товары, когда их запас заканчивается, чтобы предотвратить оформление заказа недоступных товаров. Одновременно важна возможность автоматически возвращать товар в активное состояние, когда наличие восстанавливается. В стандартном WooCommerce такой функционал требует доработки.
Проверка текущего состояния товаров
Для диагностики используйте SQL-запрос или панель администрирования WooCommerce:
- В админке перейдите в Товары и проверьте столбец Наличие.
- Запустите SQL-запрос для выборки товаров с нулевым или отрицательным запасом:
SELECT ID, post_title FROM wp_posts p JOIN wp_postmeta pm ON p.ID = pm.post_id WHERE pm.meta_key = '_stock' AND CAST(pm.meta_value AS SIGNED) <= 0 AND p.post_type = 'product' AND p.post_status = 'publish';Если такие товары есть, необходимо автоматизировать их временное отключение.
Пошаговое решение: автоматическое отключение и восстановление товаров по наличию
Реализуем на базе стандартных хуков WooCommerce cron-задачу, которая будет регулярно проверять наличие и менять статус товара.
1. Добавление cron-задачи
add_filter('cron_schedules', function($schedules) {
$schedules['every_five_minutes'] = [
'interval' => 300,
'display' => __('Каждые 5 минут')
];
return $schedules;
});
if (!wp_next_scheduled('auto_disable_products_stock_check')) {
wp_schedule_event(time(), 'every_five_minutes', 'auto_disable_products_stock_check');
}2. Функция отключения и восстановления
add_action('auto_disable_products_stock_check', function() {
// Получаем товары с запасом <= 0 и статусом publish
$args_disable = [
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => [[
'key' => '_stock',
'value' => 0,
'compare' => '<=',
'type' => 'NUMERIC'
]],
'post_status' => 'publish'
];
$query_disable = new WP_Query($args_disable);
while ($query_disable->have_posts()) {
$query_disable->the_post();
wp_update_post(['ID' => get_the_ID(), 'post_status' => 'draft']);
}
wp_reset_postdata();
// Получаем товары с запасом > 0 и статусом draft
$args_enable = [
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => [[
'key' => '_stock',
'value' => 0,
'compare' => '>',
'type' => 'NUMERIC'
]],
'post_status' => 'draft'
];
$query_enable = new WP_Query($args_enable);
while ($query_enable->have_posts()) {
$query_enable->the_post();
wp_update_post(['ID' => get_the_ID(), 'post_status' => 'publish']);
}
wp_reset_postdata();
});3. Добавление уведомления администраторам
Для контроля можно добавить отправку email с результатами проверки:
add_action('auto_disable_products_stock_check', function() {
$disabled = [];
$enabled = [];
// Аналогично коду выше, но собираем ID и названия для отчёта
// ...
// отправка email
if (!empty($disabled) || !empty($enabled)) {
$message = "Отключены товары:\n" . implode("\n", $disabled) . "\n\nВключены товары:\n" . implode("\n", $enabled);
wp_mail(get_option('admin_email'), 'Отчет автоотключения товаров', $message);
}
});Проверка результата после внедрения
- Запустите cron вручную через WP Crontrol или посетите сайт, чтобы cron сработал.
- Проверьте в админке WooCommerce, что товары с запасом 0 переведены в статус Черновик.
- Пополните запас товара и проверьте, что он автоматически возвращается в статус Опубликовано.
- Убедитесь, что письма с отчетом приходят на почту администратора.
Частые ошибки и пути их исправления
- Cron не запускается. Проверьте, активирован ли WP Cron и нет ли конфликтов с плагинами кэширования. Для теста используйте плагин WP Crontrol.
- Статус товара не меняется. Убедитесь, что WP_Query получает правильные товары (проверьте параметры meta_query и post_status).
- Письма не отправляются. Проверьте настройки SMTP сервера и функцию wp_mail(). Для теста можно установить плагин WP Mail Logging.
- Конфликт с плагинами управления запасами. Если есть, нужно интегрировать этот код с их API или отключить конфликтующие функции.
Практические советы по производительности и безопасности
- Для магазинов с большим количеством товаров ограничьте выборку постранично и используйте transients для кеширования результатов.
- Не делайте частое выполнение cron чаще 5 минут, чтобы не нагружать сервер.
- Используйте capability checks и nonce, если добавляете интерфейс управления для этой функции.
- Регулярно проверяйте логи ошибок PHP и почтовые логи для своевременного обнаружения проблем.
Сравнение вариантов реализации автоматического отключения товаров
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Плагин сторонний (например, WooCommerce Out of Stock Manager) | Быстрая установка, готовый UI, поддержка | Может быть громоздким, нагрузка, ограничения кастомизации | Для небольших магазинов, без особых требований |
| Кастомный cron-скрипт (как в статье) | Максимальная гибкость, легковесность, полное управление | Требует знаний PHP, поддержки кода, тестирования | Для опытных разработчиков и крупных проектов |
| Ручное управление через админку | Простота | Высокая вероятность ошибок, трудозатратно | Для очень маленьких магазинов |