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

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

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

  • В каталоге остаются товары с нулевым остатком, которые не планируется пополнять;
  • Есть товары с ограниченным сроком актуальности (например, сезонные или промо-товары);
  • Администратор тратит много времени на ручное удаление устаревших товаров.

Если не удалять такие товары, страдает пользовательский опыт и SEO — сайт загружен устаревшим контентом.

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

1. Добавляем кастомное поле с датой удаления

Для управления датой удаления у товара создайте произвольное поле (custom meta) delete_after_date. Его можно добавить вручную через админку или программно:

add_action('woocommerce_product_options_general_product_data', function() {
    woocommerce_wp_text_input([
        'id' => 'delete_after_date',
        'label' => 'Дата удаления товара (YYYY-MM-DD)',
        'desc_tip' => true,
        'description' => 'Товар будет автоматически удалён после указанной даты'
    ]);
});

add_action('woocommerce_process_product_meta', function($post_id) {
    if (isset($_POST['delete_after_date'])) {
        update_post_meta($post_id, 'delete_after_date', sanitize_text_field($_POST['delete_after_date']));
    }
});

2. Создаём WP-Cron задачу для ежедневной проверки товаров

Добавьте функцию, которая ежедневно проверяет товары и удаляет те, у которых:

  • Остаток равен 0;
  • Дата в delete_after_date меньше или равна текущей.
function auto_delete_expired_products() {
    $today = date('Y-m-d');
    $args = [
        'post_type' => 'product',
        'posts_per_page' => -1,
        'meta_query' => [
            'relation' => 'AND',
            [
                'key' => '_stock',
                'value' => '0',
                'compare' => '=',
                'type' => 'NUMERIC'
            ],
            [
                'key' => 'delete_after_date',
                'value' => $today,
                'compare' => '<=',
                'type' => 'DATE'
            ]
        ]
    ];

    $query = new WP_Query($args);
    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            wp_delete_post(get_the_ID(), true); // без возможности восстановления
        }
    }
    wp_reset_postdata();
}

if (!wp_next_scheduled('auto_delete_expired_products_hook')) {
    wp_schedule_event(time(), 'daily', 'auto_delete_expired_products_hook');
}
add_action('auto_delete_expired_products_hook', 'auto_delete_expired_products');

3. Проверяем остаток товара

В WooCommerce остаток хранится в мета-поле _stock. Если у вас используется управление запасами, убедитесь, что оно включено для товаров, чтобы это поле корректно обновлялось.

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

  • Создайте тестовый товар с остатком 0 и датой удаления, например, вчерашней.
  • Запустите вручную функцию auto_delete_expired_products через WP-CLI:
wp eval 'auto_delete_expired_products();'
  • Убедитесь, что товар удалился из админки и на сайте.
  • Проверьте логи сервера и работу WP-Cron (например, с плагином WP Control) — должна быть запланирована ежедневная задача.

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

  • Товары не удаляются, хотя условия выполняются: Проверьте, что WP-Cron работает корректно. На некоторых хостингах WP-Cron не запускается автоматически, используйте системный cron для вызова wp-cron.php.
  • Удаляются не те товары: Проверьте правильность мета-запроса. Например, поле _stock должно быть числом, а дата — в формате YYYY-MM-DD.
  • Удаление происходит, но товары остаются в базе: Используйте wp_delete_post($id, true) с параметром true для безвозвратного удаления.
  • Проблемы с производительностью при большом каталоге: Делайте выборку и удаление партиями, например, по 50 товаров за запрос.

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

  • Используйте безвозвратное удаление только для товаров, которые точно не понадобятся — резервируйте базу перед внедрением.
  • Ограничьте права пользователей, чтобы никто случайно не менял дату удаления без контроля.
  • Для больших магазинов оптимизируйте запросы, используйте индексы в БД по мета-полям.
  • Проверяйте логи WP-Cron и ошибок PHP, чтобы вовремя отлавливать сбои автоматизации.

Сравнение вариантов реализации удаления товаров

МетодПлюсыМинусыРекомендуем
Плагин автоматизации удаленияБыстрая настройка, готовые функцииМожет нагружать сайт, ограничения в настройкахДля небольших магазинов
Кастомный WP-Cron с мета-полямиГибкость, точный контроль, легко расширятьТребует навыков программирования, настройка cronДля средних и больших проектов
Ручное удаление через админкуПростота, нет кодаЗатратно по времени, риск ошибокДля малых магазинов с небольшим ассортиментом
Как удалить пустые HTML-теги в WordPress
24.03.2026
Как удалить или скрыть частичные (черновики) посты в WordPress
18.02.2026
Как избежать конфликтов между WooCommerce и плагинами: как отслеживать и решать
06.05.2026
Как избежать конфликтов между плагинами в WordPress
22.02.2026
Автоматическое удаление спам комментариев в WordPress
21.01.2026