WooCommerce: автоматическое отключение товаров при отсутствии наличия и их восстановление

Диагностика проблемы отсутствия товаров в наличии

В интернет-магазинах на 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, поддержки кода, тестированияДля опытных разработчиков и крупных проектов
Ручное управление через админкуПростотаВысокая вероятность ошибок, трудозатратноДля очень маленьких магазинов
Как использовать хук WooCommerce add_to_cart для удаления товаров после покупки
07.07.2026
WooCommerce: решение проблем с отображением стоимости вариативных товаров в Elementor
29.05.2026
WooCommerce: решение проблемы отсутствия связанных товаров в Elementor
25.05.2026
Как создать автоматические резервные копии WordPress с плагинами и кастомным кодом
23.11.2025
Как добавить динамические картинки в Elementor для WordPress
20.03.2026