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

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

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

Как проверить, есть ли у вас такие товары? В административной панели WooCommerce можно использовать расширенный фильтр:

  • Перейдите в ТоварыВсе товары.
  • Добавьте фильтр по количеству заказов (если доступно) или экспортируйте список товаров для анализа.

Аналитика через SQL напрямую даст точные данные о товарах без продаж.

Пошаговое решение: удаление товаров без заказов с помощью PHP-кода

Для автоматизации процесса можно создать кастомный скрипт, который удалит все товары без заказов. Добавьте следующий код в файл functions.php вашей темы (рекомендуется использовать дочернюю тему) или в отдельный плагин:

function wc_delete_products_without_orders() {
    if ( ! current_user_can('manage_woocommerce') ) {
        return;
    }

    $args = [
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'post_status'    => 'publish',
        'fields'         => 'ids',
    ];

    $product_ids = get_posts($args);
    
    foreach ($product_ids as $product_id) {
        $orders = wc_get_orders([
            'limit'        => 1,
            'status'       => ['completed', 'processing', 'on-hold'],
            'product_id'   => $product_id,
            'return'       => 'ids',
        ]);

        if (empty($orders)) {
            wp_delete_post($product_id, true); // Безвозвратно удаляет товар
        }
    }
}

// Для запуска вручную через WP-CLI или временно вызовите функцию
// wc_delete_products_without_orders();

Объяснение кода:

  • Получаем все опубликованные товары.
  • Для каждого товара проверяем наличие заказов со статусом completed, processing или on-hold.
  • Если заказов нет, удаляем товар без возможности восстановления.

Автоматизация удаления с помощью WP-Cron

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

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

add_action('wc_delete_products_without_orders_event', 'wc_delete_products_without_orders');

Это позволит ежедневно автоматически удалять неиспользуемые товары.

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

Чтобы убедиться, что удаление сработало:

  • Перейдите в Товары и проверьте количество товаров — оно должно уменьшиться.
  • Запустите SQL-запрос для проверки товаров без заказов, например:
SELECT p.ID, p.post_title
FROM wp_posts p
LEFT JOIN wp_woocommerce_order_items oi ON oi.order_item_name = p.ID
WHERE p.post_type = 'product'
AND p.post_status = 'publish'
AND oi.order_item_id IS NULL;

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

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

  • Неверный статус заказа: Если в магазине используются кастомные статусы, их нужно добавить в фильтр 'status' в wc_get_orders.
  • Удаление не происходит: Проверьте права пользователя, от имени которого запускается функция. Рекомендуется добавлять проверку current_user_can('manage_woocommerce').
  • Высокая нагрузка при большом количестве товаров: Разбейте удаление по партиям с помощью paged и offset в запросах, чтобы избежать таймаутов.
  • Удаление товаров с вариациями: В WooCommerce вариации — отдельные записи. Удаление родительского товара удалит вариации автоматически.

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

  • Перед массовым удалением сделайте резервную копию базы данных.
  • Реализуйте логирование удаленных товаров для контроля.
  • Используйте WP-CLI для запуска скриптов в командной строке, это быстрее и безопаснее, чем через веб-интерфейс.
  • Планируйте удаление в период низкой нагрузки сайта.

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

МетодПлюсыМинусы
Ручное удаление через админку Простота, нет кода Долго, неудобно при большом количестве товаров
Кастомный PHP-скрипт с WP-Cron Автоматизация, гибкость, подходит для больших магазинов Требует навыков разработки, возможность ошибок при неправильном коде
Плагины очистки (например, WPShop Clearfy Pro) Простая настройка, дополнительные функции оптимизации Может замедлять сайт, требует покупки и поддержки
Как автоматизировать удаление старого и неиспользуемого кода в WordPress
25.02.2026
Как создать динамические шорткоды в WordPress с использованием AJAX
30.01.2026
Оптимизация базы данных WordPress для ускорения работы сайта
23.12.2025
WooCommerce: решение проблем с автоматическим удалением товаров без заказов
28.05.2026
Как избежать конфликтов между плагинами в WordPress: практические советы и примеры
15.03.2026