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

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

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

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

SELECT u.ID, u.user_login, MAX(p.post_date) AS last_order_date
FROM wp_users u
LEFT 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')
WHERE u.ID IN (
  SELECT user_id FROM wp_usermeta WHERE meta_key = 'wp_capabilities' AND meta_value LIKE '%customer%'
)
GROUP BY u.ID
ORDER BY last_order_date ASC;

Если вы видите много пользователей без заказов или с последним заказом больше года назад, стоит рассмотреть автоматическое удаление таких записей.

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

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

Для примера возьмём пользователей с ролью customer без заказов за последние 365 дней.

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

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

function wpcoder_delete_inactive_customers() {
    $args = array(
        'role' => 'customer',
        'meta_query' => array(),
        'fields' => 'ID',
        'number' => -1,
    );

    $inactive_days = 365;
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $inactive_days . ' days'));

    $user_ids = get_users($args);

    foreach ($user_ids as $user_id) {
        $last_order = new WP_Query(array(
            'post_type' => 'shop_order',
            'post_status' => array('wc-completed', 'wc-processing'),
            'author' => $user_id,
            'posts_per_page' => 1,
            'orderby' => 'date',
            'order' => 'DESC',
            'fields' => 'ids'
        ));

        if (!$last_order->have_posts()) {
            // Нет заказов, удаляем пользователя
            require_once(ABSPATH . 'wp-admin/includes/user.php');
            wp_delete_user($user_id);
            continue;
        }

        $order_date = get_the_date('Y-m-d H:i:s', $last_order->posts[0]);
        if ($order_date < $date_threshold) {
            wp_delete_user($user_id);
        }
    }
}

3. Запускаем функцию по расписанию с помощью WP-Cron

Добавьте в functions.php:

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

add_action('wpcoder_delete_inactive_customers_cron', 'wpcoder_delete_inactive_customers');

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

Чтобы убедиться, что функция работает:

  • Проверьте логи сервера или добавьте в функцию запись в кастомный лог, например, error_log('Deleted user ID: '.$user_id);.
  • Перед запуском на продакшене попробуйте вызвать функцию вручную и проверьте, что удаляются только нужные пользователи.
  • Проверьте количество пользователей роли customer до и после запуска.

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

  • Удаление администраторов или пользователей с другими ролями. Проверьте, что в get_users указан строгий фильтр по роли customer.
  • Пользователи не удаляются. Возможно, функция не вызывается по расписанию — проверьте WP-Cron с помощью плагина WP Crontrol.
  • Ошибка прав доступа или нехватка памяти. Убедитесь, что у PHP достаточно ресурсов и что функция выполняется с нужными правами.
  • Удаление пользователей с активными заказами. Проверьте корректность сравнения даты последнего заказа и порогового значения.

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

  • Перед удалением пользователей сделайте резервную копию базы данных.
  • Добавьте в функцию лимит на число удалений за один запуск, чтобы избежать перегрузки сервера.
  • Логируйте удаление пользователей для последующего аудита.
  • Для крупных баз используйте WP-Cron с интервалом не чаще раза в день.
  • Оптимизируйте запросы — вместо WP_Query для каждого пользователя можно сделать один SQL-запрос для получения пользователей с просроченными заказами.

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

Метод Плюсы Минусы
Ручное удаление через админку Просто, не требует кода Трудозатратно, риск пропуска
Код с WP-Cron (как в статье) Автоматизация, гибкость настройки Требует навыков, возможна нагрузка
Плагины для управления пользователями Удобный интерфейс, дополнительные функции Могут быть тяжелыми, не всегда гибкие
Автоматическое удаление отменённых заказов в WooCommerce по сроку хранения
27.05.2026
WooCommerce: автоматическое удаление старых заказов по статусу
04.06.2026
Как использовать WP-CLI для автоматизации WordPress
04.12.2025
Как исправить ошибку maximum execution time в WordPress
08.12.2025
Как удалить неиспользуемые CSS и JS в WordPress для ускорения сайта
09.02.2026