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

Почему важно удалять забытые товары в WooCommerce

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

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

Сначала нужно понять, какие товары считать "забытыми". К типичным критериям относят:

  • Отсутствие продаж за определённый период, например, 6 месяцев
  • Отсутствие обновлений товара (например, дата последнего изменения более 6 месяцев назад)
  • Статус товара — черновик или архив

Для диагностики используйте SQL-запросы напрямую в базе или через плагины, например, Query Monitor, чтобы найти товары, которые не продавались и не обновлялись долгое время.

Пошаговое решение: автоматизация удаления забытых товаров

1. Создаем WP-Cron задачу

WP-Cron позволяет запускать регулярные задачи в WordPress. Для удаления забытых товаров создадим задачу, которая будет запускаться еженедельно.

function schedule_delete_old_products() {
    if ( ! wp_next_scheduled( 'delete_old_products_hook' ) ) {
        wp_schedule_event( time(), 'weekly', 'delete_old_products_hook' );
    }
}
add_action( 'wp', 'schedule_delete_old_products' );

2. Обрабатываем удаление товаров по условию

Добавим функцию, которая будет искать товары без продаж и старше 6 месяцев, и удалять их.

add_action( 'delete_old_products_hook', 'delete_old_products' );

function delete_old_products() {
    global $wpdb;

    $six_months_ago = date('Y-m-d H:i:s', strtotime('-6 months'));

    // Получаем ID товаров, которые не продавались и не обновлялись
    $product_ids = $wpdb->get_col( $wpdb->prepare(
        "SELECT p.ID FROM {$wpdb->posts} p
         LEFT JOIN {$wpdb->prefix}woocommerce_order_items oi ON oi.order_item_name = p.post_title
         LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta oim ON oi.order_item_id = oim.order_item_id
         WHERE p.post_type = 'product'
         AND p.post_modified < %s
         AND p.post_status = 'publish'
         GROUP BY p.ID
         HAVING COUNT(oim.meta_value) = 0",
        $six_months_ago
    ));

    if ( ! empty( $product_ids ) ) {
        foreach ( $product_ids as $product_id ) {
            wp_trash_post( $product_id ); // Перемещаем товар в корзину
        }
    }
}

Обратите внимание: запрос ищет товары с датой последнего изменения старше 6 месяцев и без заказов. По желанию можно изменить логику или добавить дополнительные проверки.

3. Очистка корзины WooCommerce

Удаление товаров помещает их в корзину. Чтобы окончательно удалить их, можно настроить дополнительную задачу для очистки корзины.

function schedule_empty_trash() {
    if ( ! wp_next_scheduled( 'empty_product_trash_hook' ) ) {
        wp_schedule_event( time(), 'weekly', 'empty_product_trash_hook' );
    }
}
add_action( 'wp', 'schedule_empty_trash' );

add_action( 'empty_product_trash_hook', 'empty_product_trash' );

function empty_product_trash() {
    $trashed = get_posts([
        'post_type'      => 'product',
        'post_status'    => 'trash',
        'posts_per_page' => -1,
        'fields'         => 'ids',
    ]);

    foreach ( $trashed as $product_id ) {
        wp_delete_post( $product_id, true ); // Удаляем безвозвратно
    }
}

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

  • Запустите задачу вручную для теста, вызвав функцию delete_old_products() через WP-CLI или временно добавив вызов в шаблон.
  • Проверьте наличие удалённых товаров в корзине WooCommerce в админке.
  • Проверьте, что товары, которые должны были удалиться, действительно исчезли.
  • Посмотрите логи cron-задач с помощью плагина WP Control, чтобы убедиться, что задачи выполняются по расписанию.

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

  • Товары не удаляются: Проверьте, что WP-Cron активен и задачи запланированы. На некоторых хостингах WP-Cron не работает без внешних вызовов.
  • Запрос SQL не находит товары: Убедитесь, что в таблицах заказа есть необходимые связи. Иногда нужно адаптировать запрос под структуру данных.
  • Удаляются нужные товары: Проверьте логику условий, возможно, стоит добавить дополнительные фильтры, например, по категории или меткам.
  • Перманентное удаление не происходит: Убедитесь, что функция wp_delete_post($id, true) вызывается корректно и права позволяют удалять товары.

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

  • Перед удалением товаров делайте резервные копии базы данных.
  • Запускайте удаление в низконагруженное время, чтобы не перегружать сервер.
  • Добавьте логирование действий, чтобы отслеживать, какие товары и когда удалялись.
  • Используйте транзиты или опции для временного кеширования результатов запроса, если товаров много.
  • Для больших магазинов разбивайте удаление на чанки, чтобы избежать тайм-аутов.

Сравнение вариантов реализации: плагин vs код

ПараметрПлагинРучной код (WP-Cron)Компромисс
ГибкостьСредняя — готовый функционалВысокая — точечные настройкиКод можно адаптировать под любые задачи
ПроизводительностьМожет быть избыточнымОптимизирован под сайтВручную можно оптимизировать запросы
БезопасностьЗависит от качества плагинаКонтроль над каждым этапомКод требует тестирования
Сложность внедренияНизкаяСредняя — требует навыковБаланс зависит от задачи
Как удалить кэш в WordPress: практическое руководство
21.11.2025
Как отключить или удалить системные письма WordPress
23.01.2026
Как использовать Customizer для создания настроек темы WordPress
18.02.2026
Автоматическое удаление спам-комментариев в WordPress
26.01.2026
Как добавить собственные виджеты в WordPress
24.11.2025