Диагностика проблемы с неактивными клиентами в WooCommerce
Большие интернет-магазины на WooCommerce со временем накапливают большое количество пользователей, которые зарегистрировались, но не делали заказов или давно не активны. Это замедляет работу базы данных, усложняет маркетинговые кампании и мешает анализу клиентов. Чтобы выявить неактивных клиентов, нужно понять, что считать «неактивностью» — обычно это отсутствие заказов за определённый период.
Для диагностики можно выполнить SQL-запрос в базе данных или использовать PHP-код с WP_Query, чтобы получить список пользователей, не совершавших покупок, например, за последние 12 месяцев.
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')
GROUP BY u.ID
HAVING last_order_date IS NULL OR last_order_date < DATE_SUB(NOW(), INTERVAL 12 MONTH);Если в результате много пользователей без заказов или с заказами более года назад, имеет смысл автоматизировать их удаление.
Пошаговое решение: автоматическое удаление неактивных клиентов
1. Создаём WP-Cron задачу для периодической проверки
Добавим функцию, которая запускается раз в месяц и удаляет пользователей, не совершавших покупок более 12 месяцев.
function wpeditor_delete_inactive_customers() {
$args = [
'role' => 'customer',
'fields' => 'ID',
'number' => -1,
];
$user_query = new WP_User_Query($args);
$inactive_users = [];
foreach ($user_query->get_results() as $user_id) {
$orders = wc_get_orders([
'customer_id' => $user_id,
'limit' => 1,
'orderby' => 'date',
'order' => 'DESC',
'status' => ['completed', 'processing'],
]);
if (empty($orders)) {
$inactive_users[] = $user_id; // Нет заказов вообще
} else {
$last_order_date = $orders[0]->get_date_created();
if ($last_order_date < strtotime('-12 months')) {
$inactive_users[] = $user_id;
}
}
}
foreach ($inactive_users as $user_id) {
wp_delete_user($user_id);
}
}
if (!wp_next_scheduled('wpeditor_monthly_inactive_customer_cleanup')) {
wp_schedule_event(time(), 'monthly', 'wpeditor_monthly_inactive_customer_cleanup');
}
add_action('wpeditor_monthly_inactive_customer_cleanup', 'wpeditor_delete_inactive_customers');2. Добавляем возможность ручного запуска из админки (опционально)
Для тестирования или внеплановой очистки полезно сделать кнопку в админке.
add_action('admin_menu', function() {
add_submenu_page('users.php', 'Удалить неактивных клиентов', 'Удалить неактивных', 'manage_options', 'wpeditor-delete-inactive', 'wpeditor_delete_inactive_page');
});
function wpeditor_delete_inactive_page() {
if (isset($_POST['wpeditor_delete_inactive_submit'])) {
wpeditor_delete_inactive_customers();
echo '<div class="updated notice">Удаление завершено.</div>';
}
echo '<form method="post"><input type="submit" name="wpeditor_delete_inactive_submit" value="Удалить неактивных клиентов" class="button button-primary" /></form>';
}Проверка результата после внедрения
- Проверьте Cron задачи с помощью плагина WP Crontrol — должна быть задача
wpeditor_monthly_inactive_customer_cleanup. - Посмотрите список пользователей с ролью «customer» и убедитесь, что неактивные удалены.
- Для ручного запуска — посетите страницу в админке «Пользователи -> Удалить неактивных» и нажмите кнопку, затем проверьте логи и пользователей.
- Можно добавить логирование в функцию удаления для контроля, например, записывать в файл или опцию число удалённых пользователей.
Частые ошибки и как их исправить
- Удаляются администраторы или другие роли. Проверьте, что в запросах используется фильтр по роли
customer. - Функция не запускается по Cron. Убедитесь, что WordPress Cron включён и нет конфликтов с другими плагинами. Для отладки используйте WP Crontrol.
- Удалённые пользователи возвращаются. Проверьте, не используется ли какой-то плагин, который автоматически создаёт пользователей.
- Удаление занимает слишком много ресурсов. Для больших баз ограничьте количество пользователей, обрабатываемых за один запуск, и используйте деление на партии.
Практические советы по безопасности и производительности
- Всегда делайте бэкап базы перед массовым удалением пользователей.
- Используйте транзакции или временные таблицы, если база большая и возможны сбои.
- Для больших баз лучше разбивать процесс удаления на несколько циклов с WP-Cron и хранить прогресс.
- Реализуйте проверку прав: только администраторы могут запускать удаление вручную.
- Отключайте задачу, если сайт на стадии разработки или тестирования.
Сравнение вариантов реализации удаления неактивных клиентов
| Метод | Преимущества | Недостатки |
|---|---|---|
| WP-Cron + PHP (как в статье) | Гибкость, интеграция с WooCommerce, автоматизация | Нагрузка при большом количестве пользователей, требует отладки |
| SQL-запрос в базе напрямую | Быстрое выполнение, точечное удаление | Риск ошибок, сложность интеграции, нет логики WP |
| Плагины очистки пользователей | Простота для непрофессионалов | Могут быть громоздкими, не всегда учитывают специфику WooCommerce |