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

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

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

Проблема: вручную отслеживать и удалять товары неудобно и рискованно — можно случайно удалить нужный товар. Автоматизация решит эту задачу.

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

1. Определяем критерии удаления

Например, удалять товары, которые не связаны с заказами со статусом completed, или которые были в заказах со статусом cancelled более 30 дней назад.

2. Получаем ID товаров из заказов по статусу

Используем WP_Query и запросы к таблицам WooCommerce для выборки товаров.

3. Пишем функцию для удаления товаров

function wpbit_delete_products_by_order_status( $statuses = array('cancelled'), $days = 30 ) {
    global $wpdb;
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    // Получаем ID заказов с нужным статусом и датой
    $orders = wc_get_orders(array(
        'status' => $statuses,
        'date_modified' => '<' . $date_threshold,
        'limit' => -1,
        'return' => 'ids',
    ));

    if (empty($orders)) {
        return 'Нет заказов для обработки';
    }

    // Получаем ID товаров из этих заказов
    $product_ids = array();
    foreach ($orders as $order_id) {
        $order = wc_get_order($order_id);
        foreach ($order->get_items() as $item) {
            $product_ids[] = $item->get_product_id();
        }
    }

    $product_ids = array_unique($product_ids);
    if (empty($product_ids)) {
        return 'Нет товаров для удаления';
    }

    // Удаляем товары
    foreach ($product_ids as $pid) {
        wp_delete_post($pid, true); // true - без перемещения в корзину
    }

    return count($product_ids) . ' товаров удалено';
}

4. Добавляем запуск задачи по Cron

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

add_action('wpbit_delete_products_cron', function() {
    $result = wpbit_delete_products_by_order_status(array('cancelled'), 30);
    error_log('[WPBit Cron] ' . $result);
});

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

  • Проверьте логи ошибок (error_log) для сообщений от функции.
  • В админ-панели WooCommerce проверьте наличие заказов со статусом cancelled старше 30 дней.
  • Убедитесь, что соответствующие товары исчезли из каталога (проверьте по ID или названию).
  • Тестируйте на тестовом сайте перед запуском на боевом.

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

  • Ошибка: Товары не удаляются.
    • Причина: функция не вызывается. Проверьте регистрацию Cron задачи и наличие хука.
  • Ошибка: Удаляются нужные товары.
    • Причина: некорректно определены критерии или переданы статусы заказов. Проверьте входные параметры функции.
  • Ошибка: Перегрузка сервера при большом количестве заказов.
    • Решение: разбейте удаление на партии, используйте WP-CLI или фоновые задачи через Action Scheduler.

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

  • Перед удалением делайте бэкап базы данных.
  • Добавьте проверку прав пользователя, если запускаете удаление через панель.
  • Используйте wp_delete_post($pid, true) для полного удаления без перемещения в корзину, чтобы сэкономить место.
  • Для крупных магазинов вынесите логику в WP-CLI команду или в плагин с Action Scheduler, чтобы избежать таймаутов.
  • Логируйте результаты удаления в отдельный файл для последующего аудита.

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

МетодПлюсыМинусыРекомендуется для
Ручное удаление через админкуПростота, контрольТрудозатратно, риск ошибкиМаленькие магазины
Автоматизация через Cron и кастомный кодАвтоматизация, точный контрольТребует навыков, возможны ошибки в логикеСредние магазины
Использование плагинов для очистки каталогаПростота, готовые решенияМогут удалять лишнее, нагрузкаНачинающие, быстрые решения
Как автоматизировать удаление черного списка IP в WordPress
14.02.2026
Как установить автоматическое отображение отзывов в WordPress
03.04.2026
Как использовать хук WPBit для автоматического изменения содержимого записей в WordPress
22.02.2026
Оптимизация базы данных WordPress: используем плагины и пишем свой код
21.11.2025
Как автоматизировать удаление старых пустых записей в WordPress
10.02.2026