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

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

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

Задача — автоматизировать удаление товаров, которые неактивны (по дате последнего изменения или по отсутствию заказов) в течение заданного периода. Это снижает нагрузку на базу и улучшает управление ассортиментом.

Пошаговое решение: создание WP-Cron задачи для удаления неактивных товаров

1. Определение критериев неактивности

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

  • Дата последнего обновления товара (post_modified)
  • Дата последнего заказа с этим товаром (через мета-данные заказов)

В этом примере реализуем удаление товаров, не обновлявшихся более 180 дней.

2. Регистрация WP-Cron задачи

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

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

add_action( 'wc_delete_inactive_products_event', 'wc_delete_inactive_products' );

function wc_delete_inactive_products() {
    global $wpdb;
    $days_inactive = 180; // Порог в днях
    $date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days_inactive} days" ) );

    // Получаем ID товаров, которые не обновлялись дольше порога
    $query = $wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'product' AND post_modified < %s AND post_status = 'publish'",
        $date_threshold
    );

    $product_ids = $wpdb->get_col( $query );

    if ( ! empty( $product_ids ) ) {
        foreach ( $product_ids as $product_id ) {
            // Проверка на заказы с этим товаром
            $orders = wc_get_orders( array(
                'limit' => 1,
                'status' => 'any',
                'product_id' => $product_id
            ) );
            if ( empty( $orders ) ) {
                // Удаление товара
                wp_delete_post( $product_id, true );
            }
        }
    }
}

3. Отключение WP-Cron при необходимости

Если ваш сайт использует системный cron, можно отключить WP-Cron, добавив в wp-config.php:

define('DISABLE_WP_CRON', true);

И настроить системный cron для вызова wp-cron.php раз в день.

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

  • Включите отладку, добавив error_log внутри функции для логирования удаляемых товаров.
  • Просмотрите базу данных в разделе wp_posts, чтобы убедиться, что товары со старой датой и отсутствием заказов удалены.
  • Проверьте раздел «Товары» в админке WooCommerce — неактивные товары должны исчезнуть.

Частые ошибки при автоматическом удалении товаров

  • Удаление товаров с активными заказами. Ошибка возникает, если не проверять наличие заказов с товаром. В нашем коде это проверка wc_get_orders.
  • Неправильный формат даты. Убедитесь, что post_modified сравнивается в формате 'Y-m-d H:i:s'.
  • Неправильный хук для WP-Cron. Используйте уникальные имена событий, чтобы не конфликтовать с другими задачами.
  • Отсутствие прав на удаление. Проверьте, что код запускается с достаточными правами (в админке или через плагин).

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

  • Перед удалением всегда делайте резервную копию базы данных.
  • Используйте wp_delete_post( $id, true ) для полного удаления, без помещения в корзину.
  • Добавьте лимит на количество удаляемых товаров за один запуск, чтобы избежать таймаутов:
$limit = 20;
$product_ids = array_slice( $product_ids, 0, $limit );
  • Используйте системный cron для надежности выполнения задач на больших сайтах.
  • Логируйте результаты удаления в файл для последующего аудита.

Сравнение вариантов удаления неактивных товаров

МетодПлюсыМинусыПример
WP-Cron с кастомным кодомГибкость, контроль, нет лишних плагиновТребует знаний, возможны таймауты на больших базахПример кода выше
Плагины очистки WooCommerceПростота настройки, пользовательский интерфейсМогут быть платными, требуют обновленияНапример, "WooCommerce Smart Manager" с фильтрами
SQL скрипты вручнуюБыстро и эффективно для опытных администраторовРиск ошибок, нет автоматизацииDELETE запросы по дате и статусу
WooCommerce: Автоматическое удаление товаров с отсутствующими атрибутами и вариациями
13.05.2026
Авто удаление записей и комментариев в WordPress через 7 дней
06.01.2026
WooCommerce: как автоматически удалить отзывы после покупки без плагинов
29.04.2026
Как запретить регистрацию в WordPress и удалить форму регистрации
13.03.2026
Как создать собственный виджет для WordPress с примерами кода
21.11.2025