Диагностика проблемы: зачем и когда удалять неактивных клиентов в WooCommerce
В интернет-магазинах на WooCommerce со временем накапливается большое количество пользователей, которые давно не совершали покупок. Это приводит к разрастанию базы данных, замедлению запросов и усложнению аналитики. Кроме того, неактивные клиенты могут мешать рассылкам и искажать статистику.
Основная задача — автоматически определять клиентов, у которых не было активных заказов за определённый период (например, 1 год), и удалять их из базы.
Как проверить, есть ли неактивные пользователи
В базе данных 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
HAVING last_order_date IS NULL OR last_order_date < DATE_SUB(NOW(), INTERVAL 1 YEAR);Этот запрос покажет список пользователей с ролью customer, у которых нет заказов или последний заказ старше 1 года.
Пошаговое решение: как автоматически удалять неактивных клиентов
1. Создаём функцию для поиска и удаления пользователей
Вставьте следующий код в файл functions.php вашей дочерней темы или в кастомный плагин:
function wpkpi_delete_inactive_customers() {
$args = array(
'role' => 'customer',
'fields' => ['ID'],
'number' => -1,
);
$users = get_users($args);
$threshold_date = strtotime('-1 year');
foreach ($users as $user) {
$last_order = wc_get_customer_last_order($user->ID);
$last_order_date = $last_order ? strtotime($last_order->get_date_created()) : 0;
if ($last_order_date === 0 || $last_order_date < $threshold_date) {
// Удаляем пользователя
wp_delete_user($user->ID);
}
}
}2. Запускаем функцию по расписанию через WP-Cron
Добавьте хук для ежемесячного запуска удаления:
if (! wp_next_scheduled('wpkpi_delete_inactive_customers_event')) {
wp_schedule_event(time(), 'monthly', 'wpkpi_delete_inactive_customers_event');
}
add_action('wpkpi_delete_inactive_customers_event', 'wpkpi_delete_inactive_customers');3. Проверка работы
Для тестирования вы можете вызвать функцию вручную в консоли WP-CLI или добавить временный вызов:
// Временно вызвать функцию вручную
add_action('init', function() {
if (current_user_can('administrator') && isset($_GET['run_delete'])) {
wpkpi_delete_inactive_customers();
echo 'Inactive customers deleted';
exit;
}
});Перейдите в браузере на https://ваш-сайт.ru/?run_delete=1 под админом, чтобы проверить удаление.
Проверка результата после внедрения
- Запустите SQL-запрос из раздела диагностики - список пользователей должен уменьшиться.
- Проверьте пользователей в админке WordPress - неактивные клиенты должны исчезнуть.
- Отслеживайте логи ошибок и убедитесь, что ошибок нет при удалении.
Частые ошибки и как их исправить
- Пользователи не удаляются: Проверьте, что функция
wc_get_customer_last_order()корректно возвращает заказы. В WooCommerce версии ниже 3.0 может не работать. - Ошибка с правами доступа: Убедитесь, что код выполняется с правами администратора, особенно при ручном запуске.
- Удаляются не те пользователи: Проверьте корректность фильтра по роли
customer. Если у вас кастомные роли, исправьте фильтр. - Проблемы с WP-Cron: Убедитесь, что WP-Cron работает или настройте системный cron для запуска
wp-cron.php.
Практические советы по безопасности и производительности
- Резервное копирование: Перед автоматическим удалением пользователей сделайте резервную копию базы.
- Пакетная обработка: Если клиентов много, запускайте удаление частями, чтобы избежать таймаутов:
function wpkpi_delete_inactive_customers_batch($batch_size = 50) {
$args = array(
'role' => 'customer',
'fields' => ['ID'],
'number' => $batch_size,
'offset' => get_option('wpkpi_delete_offset', 0),
);
$users = get_users($args);
if (empty($users)) {
update_option('wpkpi_delete_offset', 0); // Сброс после окончания
return;
}
$threshold_date = strtotime('-1 year');
foreach ($users as $user) {
$last_order = wc_get_customer_last_order($user->ID);
$last_order_date = $last_order ? strtotime($last_order->get_date_created()) : 0;
if ($last_order_date === 0 || $last_order_date < $threshold_date) {
wp_delete_user($user->ID);
}
}
update_option('wpkpi_delete_offset', get_option('wpkpi_delete_offset', 0) + $batch_size);
}- Логи: Добавьте логирование удалённых пользователей для аудита.
- Проверка статусов заказов: В фильтрах учитывайте только нужные статусы (например, completed, processing), чтобы не удалять клиентов с активными заказами.
Сравнение вариантов реализации удаления
| Вариант | Преимущества | Недостатки |
|---|---|---|
| Код на PHP с WP-Cron | Гибкость, контроль, не требует сторонних плагинов | Нужны навыки разработки, возможны ошибки при больших базах |
| Плагины очистки базы (например, WP-Optimize) | Простота использования, готовые интерфейсы | Могут удалять не то, ограниченные настройки удаления клиентов |
| Ручное удаление через админку | Простота, полный контроль | Трудозатратно, невозможно автоматизировать |