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

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

В магазинах на WooCommerce часто возникает необходимость автоматически убирать из каталога товары, которые не продаются, либо, наоборот, те, которые связаны с определённым статусом заказа (например, отменённые или возвращённые товары). Ручная очистка каталога — трудоёмкий процесс, особенно при большом ассортименте. В этой статье разберём, как настроить автоматическое удаление товаров по статусу заказов с помощью WP-Cron и стандартных функций WooCommerce.

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

Для начала нужно получить ID товаров из заказов с нужным статусом. Например, если статус заказа cancelled, то мы найдем все товары из таких заказов.

function get_products_from_orders_by_status($status = 'cancelled') {
    $product_ids = [];
    $args = [
        'status' => $status,
        'limit' => -1 // все заказы
    ];
    $orders = wc_get_orders($args);
    foreach ($orders as $order) {
        foreach ($order->get_items() as $item) {
            $product_id = $item->get_product_id();
            if ($product_id && !in_array($product_id, $product_ids)) {
                $product_ids[] = $product_id;
            }
        }
    }
    return $product_ids;
}

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

1. Создаём функцию, которая удаляет товары из каталога по их ID.

function delete_products_by_ids(array $product_ids) {
    foreach ($product_ids as $product_id) {
        wp_delete_post($product_id, true); // true — без перемещения в корзину
    }
}

2. Создаём основную функцию-обработчик, которая объединит получение товаров и их удаление.

function auto_delete_products_by_order_status() {
    $status = 'cancelled'; // статус заказов для фильтрации
    $products_to_delete = get_products_from_orders_by_status($status);
    if (!empty($products_to_delete)) {
        delete_products_by_ids($products_to_delete);
    }
}

3. Регистрируем WP-Cron, чтобы запускать эту функцию, например, раз в сутки.

add_action('auto_delete_products_event', 'auto_delete_products_by_order_status');

// Создаем событие при активации темы или плагина
function schedule_auto_delete_products_cron() {
    if (!wp_next_scheduled('auto_delete_products_event')) {
        wp_schedule_event(time(), 'daily', 'auto_delete_products_event');
    }
}
add_action('wp', 'schedule_auto_delete_products_cron');

4. При необходимости добавьте функцию деактивации, чтобы очистить расписание.

function unschedule_auto_delete_products_cron() {
    $timestamp = wp_next_scheduled('auto_delete_products_event');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'auto_delete_products_event');
    }
}

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

  • Создайте заказ со статусом cancelled и добавьте в него товар.
  • Запустите вручную функцию auto_delete_products_by_order_status() через консоль WP-CLI или временно привяжите её к хук init для теста.
  • Проверьте, что товар удалён из каталога (в админке WooCommerce и на сайте).
  • Убедитесь, что WP-Cron запускается (можно проверить через плагин WP Crontrol или логи сервера).

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

  • Проблема: WP-Cron не срабатывает из-за отсутствия посетителей.
    Решение: Настройте системный Cron на сервере для вызова wp-cron.php или запускайте скрипт вручную через WP-CLI.
  • Проблема: Товары не удаляются, хотя функция вызывается.
    Решение: Проверьте права пользователя и настройки безопасности сервера. Функция wp_delete_post() должна иметь права удаления постов типа product.
  • Проблема: Удаляются не все товары из заказов.
    Решение: Убедитесь, что в заказах правильно установлены статусы и что функция получает все заказы (параметр limit => -1).

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

  • Перед удалением товаров сделайте резервную копию базы данных.
  • Если товаров много, разбивайте удаление на партии по 20-50 штук, чтобы не перегружать сервер.
  • Используйте транзакции базы данных или логи, чтобы отслеживать удалённые товары.
  • Проверяйте, что удаление не затрагивает товары, которые всё ещё нужны (например, с активными заказами другого статуса).

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

МетодПлюсыМинусыКогда использовать
WP-Cron с пользовательским кодомГибкость, полный контроль, бесплатныйНужны навыки разработки, зависит от трафика сайтаДля уникальных условий удаления, при небольшом/среднем трафике
Плагин для массового удаления товаровПростота, готовое решениеМожет не поддерживать автоматизацию по статусам заказовРазовые действия, без программирования
Системный Cron + WP-CLIНадёжность, не зависит от посетителейТребует доступа к серверу, знания командной строкиДля крупных магазинов с большим трафиком
Как использовать хуки WordPress для автоматизации задач
11.12.2025
Как автоматически удалять неактивных пользователей WordPress
07.02.2026
Как автоматизировать удаление старого контента в WordPress с помощью Cron и плагинов
02.03.2026
Как создать динамический виджет в WordPress: практическое руководство
14.11.2025
WooCommerce: как автоматически изменять статус заказа по условиям
29.05.2026