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

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

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

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

  • Товар опубликован более 6 месяцев назад;
  • За ним нет ни одного оплаченного заказа;
  • Товар не находится в активных промоакциях или не должен храниться для отчетности.

Как проверить, что в магазине есть такие товары

Для диагностики можно выполнить SQL-запрос к базе данных:

SELECT p.ID, p.post_title, p.post_date FROM wp_posts p
LEFT JOIN wp_woocommerce_order_items oi ON oi.order_item_name = p.ID
LEFT JOIN wp_woocommerce_order_itemmeta oim ON oim.order_item_id = oi.order_item_id AND oim.meta_key = '_product_id'
LEFT JOIN wp_posts o ON o.ID = oi.order_id AND o.post_status IN ('wc-completed', 'wc-processing')
WHERE p.post_type = 'product'
AND o.ID IS NULL
AND p.post_date < DATE_SUB(NOW(), INTERVAL 6 MONTH);

Этот запрос выводит товары старше 6 месяцев без оплаченных заказов.

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

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

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

function wpscan_delete_old_unsold_products() {
    $args = [
        'post_type'      => 'product',
        'posts_per_page' => -1,
        'date_query'     => [
            [
                'before' => '6 months ago',
            ],
        ],
        'fields'         => 'ids',
        'meta_query'     => [
            [
                'key'     => '_stock_status',
                'value'   => 'instock',
                'compare' => '=',
            ],
        ],
        'tax_query'      => [],
    ];

    $products = get_posts($args);

    foreach ($products as $product_id) {
        // Проверяем, есть ли оплаченные заказы с этим товаром
        global $wpdb;
        $count = $wpdb->get_var($wpdb->prepare(
            "SELECT COUNT(*) FROM {$wpdb->prefix}woocommerce_order_items oi
             JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim ON oi.order_item_id = oim.order_item_id
             JOIN {$wpdb->prefix}posts p ON oi.order_id = p.ID
             WHERE oim.meta_key = '_product_id'
             AND oim.meta_value = %d
             AND p.post_status IN ('wc-completed', 'wc-processing')",
            $product_id
        ));

        if (intval($count) === 0) {
            wp_delete_post($product_id, true); // Полное удаление без перемещения в корзину
        }
    }
}

2. Запускаем функцию по расписанию через wp-cron

Добавьте в functions.php следующий код для регистрации планировщика:

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

add_action('wpscan_daily_delete_old_products', 'wpscan_delete_old_unsold_products');

3. Как запустить вручную

Для тестирования вызовите функцию напрямую из админки или через WP-CLI:

wp eval 'wpscan_delete_old_unsold_products();'

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

  • Проверьте в админке WooCommerce, что товары старше 6 месяцев без заказов исчезли.
  • Повторите SQL-запрос из раздела диагностики — он должен возвращать пустой результат для старых товаров без продаж.
  • Проверьте логи сервера на предмет ошибок выполнения функции.

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

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

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

  • Запускайте удаление в ночное время для снижения нагрузки на сервер.
  • Перед удалением создавайте резервную копию базы данных.
  • Для больших магазинов используйте пакетную обработку: например, обрабатывать 50 товаров за один запуск.
  • Используйте плагин Clearfy Pro (https://wpshop.ru/plugins/clearfy?source=wpscan.ru&medium=article&campaign=woocommerce-avtomaticheskoe-udalenie-staryh-tovarov-bez-prodazh) для оптимизации базы и очистки метаданных.

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

МетодПреимуществаНедостатки
Код с wp-cronАвтоматизация, гибкая настройка, бесплатное решениеЗависимость от корректной работы wp-cron, требует навыков
Плагины очистки базыПростота использования, дополнительные функции оптимизацииМожет перегружать сайт, лицензии, не всегда гибко
Ручное удаление через админкуПолный контроль, нет риска ошибок кодаЗатратно по времени, риск пропуска товаров
Автоматическое удаление неоплаченных заказов в WooCommerce
14.05.2026
WooCommerce: автоматическое удаление старых товаров без продаж по дате и статусу
25.06.2026
Автоматическое удаление отключённых и заблокированных заказов WooCommerce с помощью кода
22.06.2026
Как автоматизировать удаление старых заказов в WooCommerce
18.03.2026
Как отключить плагины на определённых страницах WordPress
06.02.2026