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

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

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

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

Ключевое — найти пользователей, у которых отсутствуют заказы или последний заказ был сделан давно. WooCommerce хранит заказы в таблице wp_posts с типом shop_order, а связь с пользователем — в мета-данных заказа _customer_user.

Пример запроса для получения ID пользователей без заказов или с последним заказом старше N дней:

SELECT u.ID FROM wp_users u LEFT JOIN wp_posts p ON u.ID = p.post_author AND p.post_type = 'shop_order' AND p.post_status IN ('wc-completed','wc-processing') GROUP BY u.ID HAVING MAX(p.post_date) < DATE_SUB(NOW(), INTERVAL 180 DAY) OR MAX(p.post_date) IS NULL;

Замените 180 на нужный период в днях.

Пошаговое решение: автоматическое удаление неактивных клиентов с помощью WP-Cron

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

function wc_delete_inactive_customers() {  global $wpdb;  $days_inactive = 180; // период неактивности в днях  $user_ids = $wpdb->get_col(    $wpdb->prepare(      "SELECT u.ID FROM {$wpdb->users} u LEFT JOIN {$wpdb->posts} p ON u.ID = p.post_author AND p.post_type = 'shop_order' AND p.post_status IN ('wc-completed','wc-processing') GROUP BY u.ID HAVING MAX(p.post_date) < DATE_SUB(NOW(), INTERVAL %d DAY) OR MAX(p.post_date) IS NULL",      $days_inactive    )  );  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 задачу для регулярного запуска

function wc_schedule_delete_inactive_customers() {  if (!wp_next_scheduled('wc_delete_inactive_customers_hook')) {    wp_schedule_event(time(), 'daily', 'wc_delete_inactive_customers_hook');  }}
add_action('wc_delete_inactive_customers_hook', 'wc_delete_inactive_customers'); add_action('init', 'wc_schedule_delete_inactive_customers');

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

Это обеспечит ежедневную проверку и удаление неактивных клиентов.

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

  • Подождите выполнение CRON-задачи (можно вручную вызвать hook через WP-CLI: wp cron event run wc_delete_inactive_customers_hook).
  • Проверьте, что пользователи с последним заказом старше 180 дней или без заказов удалены.
  • Для диагностики временно добавьте логирование, например, error_log('Удален пользователь ID: ' . $user_id); внутри цикла удаления.
  • Убедитесь, что новые пользователи с недавними заказами остаются в базе.

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

  • Удаляются администраторы и ключевые пользователи: уточните фильтр, исключив пользователей с определенными ролями. Например, добавьте проверку if (in_array('administrator', $user->roles)) continue; перед удалением.
  • CRON-задача не срабатывает: убедитесь, что WP-Cron включен, или настройте системный cron на вызов wp-cron.php.
  • Удаление не происходит из-за прав: функция wp_delete_user() требует прав администратора, запускайте код с правильным контекстом.
  • Пользователи не удаляются, т.к. заказы имеют статус, не попадающий в выборку: в запросе учитывайте только статусы wc-completed и wc-processing, либо расширьте список по необходимости.

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

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

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

Метод Описание Плюсы Минусы
WP-Cron + кастомный код Автозапуск при помощи WP-Cron и кастомной функции Гибкость, контроль, бесплатно Зависит от работы WP-Cron, требует навыков разработки
Плагины очистки базы Готовые решения для удаления неактивных пользователей/далее очистки Простота использования, интерфейс Может не учитывать все бизнес-правила, лишние функции
Ручное удаление через админку Удаление пользователей вручную по фильтрам Контроль над процессом Неэффективно при большом количестве, трудоемко
Как удалить все пустые теги в WordPress
04.11.2025
Как установить и очистить очередь AJAX в WordPress для улучшения производительности
27.03.2026
WooCommerce: автоматическое удаление товаров из магазина по статусу заказов
04.06.2026
Как автоматизировать удаление старых записей WordPress через шорткод
01.01.2026
Как избежать проблем с отключением WP-Cron в WordPress
20.04.2026