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

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

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

Как определить товары без заказов в WooCommerce

Товар считается без заказов, если по нему не было оформлено ни одного оплаченного заказа. Для точного определения нужно учитывать статус заказов и учитывать только завершённые или обработанные заказы.

Пример SQL запроса для проверки количества заказов по товару:

SELECT p.ID, p.post_title, COUNT(oi.order_item_id) as order_count
FROM wp_posts p
LEFT JOIN wp_woocommerce_order_items oi ON p.ID = oi.order_item_id
WHERE p.post_type = 'product'
GROUP BY p.ID
HAVING order_count = 0;

Однако напрямую через SQL лучше не удалять товары — используйте WP-функции для корректного удаления.

Пошаговое решение: автоматическое удаление товаров без заказов через WP-CLI и PHP

1. Создаем функцию для проверки заказов по товару

function has_product_orders($product_id) {
    $args = array(
        'status' => array('wc-completed', 'wc-processing', 'wc-on-hold'),
        'limit' => 1,
        'return' => 'ids',
        'meta_query' => array(
            array(
                'key' => '_product_id',
                'value' => $product_id,
                'compare' => '=',
            ),
        ),
    );

    $orders = wc_get_orders($args);
    return !empty($orders);
}

2. Функция для удаления товаров без заказов

function delete_products_without_orders() {
    $args = array(
        'post_type' => 'product',
        'posts_per_page' => -1,
        'fields' => 'ids',
    );
    $products = get_posts($args);

    foreach ($products as $product_id) {
        if (!has_product_orders($product_id)) {
            wp_delete_post($product_id, true); // Полное удаление
        }
    }
}

3. Запуск удаления по расписанию WP-Cron

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

if (!wp_next_scheduled('delete_products_without_orders_hook')) {
    wp_schedule_event(time(), 'daily', 'delete_products_without_orders_hook');
}
add_action('delete_products_without_orders_hook', 'delete_products_without_orders');

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

  • Перейдите в админку WooCommerce > Товары и убедитесь, что товары без заказов удалены.
  • Проверьте логи сервера на ошибки во время выполнения WP-Cron задач.
  • Для проверки функции вручную можно вызвать delete_products_without_orders() через WP-CLI: wp eval 'delete_products_without_orders();'.

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

Ошибка: товары не удаляются

  • Причина: функция has_product_orders() неправильно определяет наличие заказов. Проверьте правильность статусов в запросе.
  • Решение: добавьте отладку, выводите ID товаров и результат проверки.

Ошибка: удаляются товары с заказами

  • Причина: в запросе для получения заказов отсутствует правильное условие по товару.
  • Решение: используйте wc_get_orders с корректным мета-запросом или альтернативно проверяйте связи в таблицах wp_woocommerce_order_items.

Ошибка: задержка при обработке большого каталога

  • Решение: разбейте удаление на порции, например, по 50 товаров за раз и запускайте через WP-Cron с интервалом.

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

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

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

МетодПлюсыМинусы
PHP с WP-CronАвтоматизация, работает внутри WPМожет нагружать сайт при большом объеме
WP-CLIБыстрый, без нагрузки на фронтендТребует доступа к серверу
Ручное удаление в админкеПростота, контрольНеэффективно для больших каталогов
Как использовать WPengine для автоматизации хранения вариантов постов в WordPress
18.02.2026
WooCommerce: автоматическое удаление товаров без заказов
12.05.2026
WordPress: разделение кода для разных устройств — практические решения
30.12.2025
WooCommerce: как автоматически удалять товары без заказов
02.05.2026
Как разделить базу данных по таблицам в WordPress для улучшения производительности
14.01.2026