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

Проблема: накопление неактивных пользователей с заказами в WooCommerce

На крупных интернет-магазинах, работающих на WooCommerce, часто возникает ситуация, когда база пользователей разрастается за счёт неактивных аккаунтов. Особенно это касается клиентов, которые сделали заказ, но давно не заходили в личный кабинет и не проявляют активности. Такие пользователи занимают место в базе данных, что может замедлять работу сайта и усложнять администрирование.

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

Как определить неактивных пользователей с заказами

Для начала необходимо понять, какие пользователи считаются неактивными. Обычно под этим понимают тех, кто:

  • не заходил на сайт более 6 месяцев;
  • имеет хотя бы один заказ в WooCommerce;
  • не делал новых заказов и не обновлял данные за указанный период.

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

SELECT u.ID, u.user_login, MAX(p.post_date) AS last_order_date
FROM wp_users u
JOIN wp_posts p ON p.post_author = u.ID AND p.post_type = 'shop_order' AND p.post_status IN ('wc-completed', 'wc-processing')
GROUP BY u.ID
HAVING last_order_date < DATE_SUB(NOW(), INTERVAL 6 MONTH);

Этот запрос покажет пользователей с последним заказом более 6 месяцев назад.

Пошаговое решение для автоматического удаления

1. Создание пользовательской функции удаления

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

function wc_delete_inactive_users_with_orders() {
    global $wpdb;

    // Получаем ID пользователей с последним заказом старше 6 месяцев
    $user_ids = $wpdb->get_col( $wpdb->prepare(
        "SELECT u.ID
         FROM {$wpdb->users} u
         JOIN {$wpdb->prefix}posts p ON p.post_author = u.ID
         WHERE p.post_type = 'shop_order'
         AND p.post_status IN ('wc-completed', 'wc-processing')
         GROUP BY u.ID
         HAVING MAX(p.post_date) < %s",
         date('Y-m-d H:i:s', strtotime('-6 months'))
    ));

    if ( empty($user_ids) ) {
        return; // Нет пользователей для удаления
    }

    foreach ( $user_ids as $user_id ) {
        require_once ABSPATH . 'wp-admin/includes/user.php';
        wp_delete_user( $user_id );
    }
}

2. Запуск функции по расписанию через WP-Cron

Чтобы автоматизировать удаление, зарегистрируйте событие WP-Cron, которое будет запускать функцию раз в месяц:

if ( ! wp_next_scheduled( 'wc_delete_inactive_users_cron' ) ) {
    wp_schedule_event( time(), 'monthly', 'wc_delete_inactive_users_cron' );
}

add_action( 'wc_delete_inactive_users_cron', 'wc_delete_inactive_users_with_orders' );

3. Опционально: уведомление администратора

Полезно получать уведомления о количестве удалённых пользователей. Измените функцию так:

function wc_delete_inactive_users_with_orders() {
    global $wpdb;

    $user_ids = $wpdb->get_col( $wpdb->prepare(
        "SELECT u.ID
         FROM {$wpdb->users} u
         JOIN {$wpdb->prefix}posts p ON p.post_author = u.ID
         WHERE p.post_type = 'shop_order'
         AND p.post_status IN ('wc-completed', 'wc-processing')
         GROUP BY u.ID
         HAVING MAX(p.post_date) < %s",
         date('Y-m-d H:i:s', strtotime('-6 months'))
    ));

    if ( empty($user_ids) ) {
        return;
    }

    foreach ( $user_ids as $user_id ) {
        require_once ABSPATH . 'wp-admin/includes/user.php';
        wp_delete_user( $user_id );
    }

    wp_mail( get_option('admin_email'), 'Удаление неактивных пользователей WooCommerce', 'Удалено пользователей: ' . count($user_ids) );
}

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

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

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

  • Ошибка: Пользователи с активными заказами удаляются.
    Причина: В запросе не учтены статусы заказов (например, ожидающие оплаты).
    Решение: Убедитесь, что в запросе фильтруются только завершённые или обработанные заказы (wc-completed, wc-processing).
  • Ошибка: Ошибка безопасности при удалении пользователей.
    Причина: Отсутствует подключение файла wp-admin/includes/user.php.
    Решение: Вызов require_once ABSPATH . 'wp-admin/includes/user.php'; обязателен перед wp_delete_user().
  • Ошибка: Запуск WP-Cron не происходит.
    Причина: WP-Cron запускается при посещении сайта, а трафика мало.
    Решение: Настройте системный cron для вызова wp-cron.php или используйте внешние сервисы.

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

  • Перед массовым удалением сделайте резервную копию базы данных.
  • Добавьте проверку прав текущего пользователя, если запускаете функцию вручную из админки.
  • Для больших баз данных разбивайте удаление на порции (batch deletion), чтобы избежать таймаутов.
  • Внимательно проверяйте, какие данные удаляются вместе с пользователем — заказы, комментарии, метаданные.
  • Для дополнительного контроля логируйте удалённые ID пользователей в отдельный файл или таблицу.

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

МетодПреимуществаНедостатки
Ручное удаление через SQL-запросыБыстро, без загрузки WordPressРиск удаления неправильных данных, сложно автоматизировать
WP_Delete_User с WP-CronБезопасно, учитывает зависимости, автоматизацияМожет требовать оптимизации для больших баз
Плагины очистки базыПростота использования, GUI, дополнительные функцииМожет не учитывать бизнес-логику, нагрузка на сайт
Как добавить поддержку WebP в WordPress: практическое руководство
14.04.2026
WooCommerce: автоматическое удаление неоплаченных и отменённых заказов с помощью кода
29.06.2026
Как использовать WP-CLI для автоматизации WordPress
04.12.2025
WooCommerce: автоматическое удаление неактивных пользователей с заказами
14.07.2026
WooCommerce: сокращение времени загрузки страниц корзины
22.05.2026