WPExperts

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

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

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

Как определить товары с нулевым остатком в WooCommerce

WooCommerce хранит остатки товара в мета-поле _stock. Чтобы найти товары с нулевым остатком, можно использовать WP_Query с мета-запросом:

$args = [
    'post_type' => 'product',
    'posts_per_page' => -1,
    'meta_query' => [
        [
            'key' => '_stock',
            'value' => '0',
            'compare' => '=',
            'type' => 'NUMERIC'
        ]
    ]
];
$query = new WP_Query($args);

Этот запрос вернёт все товары с остатком 0.

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

1. Создаём функцию удаления

function wpexperts_delete_out_of_stock_products() {
    $args = [
        'post_type' => 'product',
        'posts_per_page' => -1,
        'meta_query' => [
            [
                'key' => '_stock',
                'value' => '0',
                'compare' => '=',
                'type' => 'NUMERIC'
            ]
        ],
        'fields' => 'ids'
    ];
    $products = get_posts($args);

    if (!empty($products)) {
        foreach ($products as $product_id) {
            wp_trash_post($product_id); // Перемещаем товар в корзину
        }
    }
}

2. Регистрируем Cron-задачу

add_action('wpexperts_daily_delete_out_of_stock', 'wpexperts_delete_out_of_stock_products');

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

3. Очистка Cron при деактивации

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

Как проверить, что удаление работает

  • Создайте тестовый товар со значением _stock равным 0 через админку или в базе.
  • Запустите вручную функцию wpexperts_delete_out_of_stock_products() через WP-CLI или временно вызовите её в functions.php.
  • Проверьте, что товар перемещён в корзину (Trash) и больше не отображается в каталоге.
  • Для проверки Cron можно использовать плагин WP Crontrol, чтобы увидеть, что задача запланирована и выполнена.

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

  • Товары не удаляются, хотя остаток 0: Проверьте, что используется правильное мета-поле _stock, а не _stock_status. Второе хранит статус на складе (instock/outofstock), но не количество.
  • Удаляются не те товары: Убедитесь, что запрос фильтрует только посты с типом product. Если включен кэш, очистите его.
  • Cron-задача не запускается: Проверьте, активирован ли WP Cron, и нет ли конфликтов с плагинами или серверными настройками.
  • Потеря данных: Используйте wp_trash_post() вместо wp_delete_post() для возможности восстановления.

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

  • Используйте wp_trash_post(), чтобы не удалять товары безвозвратно сразу.
  • Ограничьте количество товаров, обрабатываемых за один запуск, если каталог большой, чтобы избежать таймаутов.
  • Для больших магазинов лучше запускать скрипт в CLI режиме через WP-CLI, а не через WP Cron.
  • Добавьте логирование действий удаления для аудита и отладки.
  • Перед удалением можно отправлять уведомления администратору или делать резервную копию базы.

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

МетодПлюсыМинусыКомпромисс
WP Cron + PHPПростой в реализации, не требует сторонних инструментовЗависит от посещаемости сайта, может не срабатывать вовремяИспользовать WP-CLI для критичных магазинов
WP-CLI скриптБыстрый, не зависит от веб-запросов, можно запускать через системный CronТребует доступа к серверу и навыков командной строкиКомбинировать с WP Cron для удобства
Плагин с графическим интерфейсомУдобство использования, настройки через админкуМожет быть тяжелее, лишний кодВыбирать лёгкие плагины, проверять совместимость
×
-15%
на премиум-тему
Bono

Создай магазин мечты
на WordPress!

↓ ↓ ↓ ↓ ↓
Купить со скидкой »