Диагностика проблемы: почему неактивные товары остаются в каталоге
В магазинах на WooCommerce часто возникает ситуация, когда товары с нулевым остатком (или ниже минимального порога) продолжают отображаться в каталоге, что негативно сказывается на пользовательском опыте и конверсии. Это происходит из-за того, что WooCommerce по умолчанию не отключает товары автоматически при отсутствии запаса.
Для выявления проблемы проверьте, отображаются ли в каталоге товары с запасом 0 или отрицательным. Можно сделать это через админку или SQL-запросом к базе:
SELECT ID, post_title FROM wp_posts p
JOIN wp_postmeta pm ON p.ID = pm.post_id
WHERE p.post_type = 'product'
AND pm.meta_key = '_stock'
AND CAST(pm.meta_value AS SIGNED) <= 0
AND p.post_status = 'publish';Если такие товары есть, но они по-прежнему активны, значит нужна автоматизация их статуса.
Пошаговое решение: как автоматически отключать товары с нулевым остатком
1. Использование WP-Cron для регулярной проверки
Добавим функцию в файл functions.php вашей темы или в кастомный плагин, которая будет запускаться по расписанию и менять статус товаров с нулевым остатком на draft (черновик).
function wprobot_auto_disable_out_of_stock_products() {
$args = [
'post_type' => 'product',
'posts_per_page' => -1,
'meta_query' => [
[
'key' => '_stock',
'value' => 0,
'compare' => '<=',
'type' => 'NUMERIC',
],
],
'post_status' => 'publish',
];
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
wp_update_post([
'ID' => get_the_ID(),
'post_status' => 'draft',
]);
}
wp_reset_postdata();
}
}
// Регистрируем событие, если оно не зарегистрировано
if (!wp_next_scheduled('wprobot_daily_disable_oos_products')) {
wp_schedule_event(time(), 'daily', 'wprobot_daily_disable_oos_products');
}
// Привязываем функцию к событию
add_action('wprobot_daily_disable_oos_products', 'wprobot_auto_disable_out_of_stock_products');2. Автоматическое включение товара при появлении запаса
Чтобы автоматически активировать товар при обновлении запаса, используем хук woocommerce_product_set_stock:
add_action('woocommerce_product_set_stock', 'wprobot_auto_enable_in_stock_product', 10, 1);
function wprobot_auto_enable_in_stock_product($product) {
if ($product->get_stock_quantity() > 0 && $product->is_type('simple')) {
$post_id = $product->get_id();
$post = get_post($post_id);
if ($post->post_status === 'draft') {
wp_update_post([
'ID' => $post_id,
'post_status' => 'publish',
]);
}
}
}Проверка результата после внедрения
- Запустите вручную задачу с помощью
do_action('wprobot_daily_disable_oos_products');в консоли WP или временно добавьте вызов функции. - Проверьте, что товары с нулевым запасом изменили статус на
draftи исчезли из каталога. - Обновите запас у отключенного товара — он должен автоматически стать активным.
- Проверьте в админке WooCommerce в списке товаров статусы товаров.
Частые ошибки и способы исправления
- Задача WP-Cron не запускается: Убедитесь, что на сервере есть трафик для триггера WP-Cron или настройте системный cron для запуска
wp-cron.php. - Неправильный мета-ключ запасов: Значение
_stockдолжно быть в метаполях товара. Если используется сторонний плагин для управления запасами, ключи могут отличаться. - Товары не меняют статус: Проверьте права пользователя, от имени которого работает скрипт, и корректность ID поста.
- Статус товара меняется, но товар все равно виден: Проверьте настройки видимости товаров (например, отображение черновиков в магазине).
Практические советы по безопасности и производительности
- Не ставьте периодичность задачи чаще, чем раз в сутки, чтобы не перегружать базу.
- Для магазинов с большим количеством товаров используйте постраничный обход (
'posts_per_page' => 100) и делайте batch-обновления с сохранением последнего ID. - Сохраняйте бэкапы перед внедрением, особенно если меняете статусы большого количества товаров.
- Логируйте изменения статусов товара в отдельный лог-файл для аудита.
Таблица сравнения подходов к автоматическому отключению товаров
| Метод | Плюсы | Минусы | Когда применять |
|---|---|---|---|
| WP-Cron + кастомный код | Гибкость, без плагинов, можно кастомизировать | Зависит от WP-Cron; требует навыков | Средние и большие магазины с уникальными требованиями |
| Плагины управления запасами | Простота настройки, готовые решения | Могут быть тяжелыми, платными | Малые магазины, без разработчиков |
| Ручное отключение | Простое, без кода | Трудозатратно, риск ошибки | Очень маленькие магазины |