WPExperts

WooCommerce: как автоматически удалять товары с нулевым остатком без плагинов

Проблема: почему нужно автоматически удалять товары с нулевым остатком

В интернет-магазинах на WooCommerce наличие товаров с нулевым остатком может создавать путаницу для покупателей, а также загромождать каталог. Автоматическое удаление таких товаров помогает поддерживать актуальность ассортимента без лишних усилий. Многие решают эту задачу с помощью плагинов, но если их количество велико или необходим тонкий контроль, лучше использовать собственные скрипты.

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

Для начала убедимся, что на сайте есть товары с нулевым остатком. В админке WooCommerce перейдите в «Товары» и примените фильтр по запасам:

  • В колонке «Остаток» найдите товары со значением 0
  • Проверьте, что товары действительно не доступны для продажи

Для программной проверки можно использовать WP-CLI:

wp post list --post_type=product --meta_key=_stock --meta_value=0 --fields=ID,post_title,_stock

Если запрос возвращает список товаров, значит задача актуальна.

Шаги решения: автоматическое удаление товаров с нулевым остатком через Cron и PHP

1. Создаем функцию для удаления товаров с нулевым остатком

function wpexperts_delete_zero_stock_products() {
    $args = [
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'meta_query'     => [
            [
                'key'     => '_stock',
                'value'   => 0,
                'compare' => '=',
                'type'    => 'NUMERIC',
            ],
        ],
        'post_status'    => ['publish', 'draft', 'private'],
        'fields'         => 'ids',
    ];

    $products = get_posts($args);

    if (empty($products)) {
        return;
    }

    foreach ($products as $product_id) {
        wp_trash_post($product_id); // Перемещаем в корзину
        // Можно заменить на wp_delete_post($product_id, true); чтобы удалить сразу
    }
}

2. Регистрируем Cron задачу для регулярного запуска

add_action('wpexperts_delete_zero_stock_event', 'wpexperts_delete_zero_stock_products');

if (!wp_next_scheduled('wpexperts_delete_zero_stock_event')) {
    wp_schedule_event(time(), 'daily', 'wpexperts_delete_zero_stock_event');
}

3. Очистка Cron задачи при деактивации темы или плагина

function wpexperts_clear_delete_zero_stock_cron() {
    $timestamp = wp_next_scheduled('wpexperts_delete_zero_stock_event');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpexperts_delete_zero_stock_event');
    }
}
register_deactivation_hook(__FILE__, 'wpexperts_clear_delete_zero_stock_cron');

Проверка результата после внедрения

После добавления кода в functions.php вашей темы или в кастомный плагин:

  • Запустите задачу вручную для теста, вызвав функцию wpexperts_delete_zero_stock_products() через WP-CLI или временно добавив вызов в файл.
  • Проверьте, что товары с нулевым остатком переместились в корзину или удалились полностью.
  • Убедитесь, что Cron событие запланировано (через плагин WP Crontrol или WP-CLI wp cron event list).

Частые ошибки и как их исправить

  • Товары не удаляются: проверьте, что мета-ключ _stock реально хранит количество, а не другой параметр (например, _stock_status).
  • Функция не вызывается по Cron: убедитесь, что WP Cron работает (на некоторых серверах нужно настроить системный CRON для вызова wp-cron.php).
  • Удаляются нужные товары: добавьте дополнительную проверку статуса товара или категории, чтобы не удалить важные позиции.

Практические советы по безопасности и производительности

  • Используйте wp_trash_post() вместо удаления, чтобы иметь возможность восстановить товары при ошибке.
  • Ограничьте количество товаров, обрабатываемых за один запуск, чтобы не перегружать сервер. Например, добавьте параметр 'posts_per_page' => 50 и запускайте несколько раз.
  • Добавьте логирование удалений в файл через error_log() или отдельный лог для отладки.
  • В целях безопасности разместите код в кастомном плагине, а не в теме, чтобы не потерять при смене шаблона.

Сравнение вариантов реализации удаления товаров с нулевым остатком

МетодПреимуществаНедостаткиКомпромисс
Плагины (например, WP All Import, автоматизация складов)Простота настройки, часто с поддержкой уведомленийНагрузка на сайт, лишние зависимостиИспользовать для больших магазинов с интеграциями
Кастомный код с CronПолный контроль, минимальные зависимости, оптимизация под задачиТребует навыков PHP и отладкиПодходит для разработчиков и небольших/средних магазинов
Ручное удалениеНет риска автоматических ошибокРучной труд, высокая вероятность забытьИспользовать как временное решение
×
до 3225₽

Продавай темы и плагины WordPress!

Лови с каждой продажи

Начать ⋙