Диагностика проблемы: зачем удалять неактивных пользователей WooCommerce
В магазинах на WooCommerce с большим количеством зарегистрированных клиентов часто накапливаются неактивные пользователи — те, кто не совершал покупок и не заходил на сайт длительное время. Это приводит к увеличению базы данных, замедлению запросов и усложнению управления клиентской информацией.
Чтобы проверить, насколько актуальна проблема на вашем сайте, выполните SQL-запрос к базе данных или воспользуйтесь плагином для анализа активности пользователей. Например, запрос для поиска пользователей без заказов и без логинов за последние 6 месяцев:
SELECT ID, user_login, user_email FROM wp_users u
LEFT JOIN wp_wc_customer_lookup c ON u.ID = c.user_id
WHERE c.user_id IS NULL
AND u.user_registered < DATE_SUB(NOW(), INTERVAL 6 MONTH);Если число таких пользователей велико, имеет смысл автоматизировать их удаление, чтобы улучшить производительность и безопасность.
Пошаговое решение: автоматическое удаление неактивных пользователей с помощью WP-Cron и кастомного кода
Шаг 1. Создайте функцию для выборки и удаления неактивных пользователей
Добавьте следующий код в файл functions.php вашей темы или в отдельный плагин:
function wpmark_delete_inactive_woocommerce_users() {
global $wpdb;
$interval = 180; // дней без активности
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$interval} days"));
// Получаем пользователей без заказов и без входа в систему за последние $interval дней
$users = $wpdb->get_results($wpdb->prepare(
"SELECT u.ID FROM {$wpdb->users} u
LEFT JOIN {$wpdb->prefix}wc_customer_lookup c ON u.ID = c.user_id
WHERE (c.user_id IS NULL OR c.last_active < %s)
AND u.user_registered < %s",
$date_threshold, $date_threshold
));
foreach ($users as $user) {
require_once ABSPATH . 'wp-admin/includes/user.php';
wp_delete_user($user->ID);
}
}Шаг 2. Зарегистрируйте WP-Cron задачу для регулярного запуска удаления
function wpmark_schedule_inactive_user_cleanup() {
if (!wp_next_scheduled('wpmark_inactive_user_cleanup_event')) {
wp_schedule_event(time(), 'daily', 'wpmark_inactive_user_cleanup_event');
}
}
add_action('wp', 'wpmark_schedule_inactive_user_cleanup');
add_action('wpmark_inactive_user_cleanup_event', 'wpmark_delete_inactive_woocommerce_users');Шаг 3. Разрешите гибко менять срок неактивности через фильтр
function wpmark_get_inactivity_interval() {
return apply_filters('wpmark_inactivity_interval_days', 180);
}
// В функции удаления замените жестко заданное число на вызов этой функции:
// $interval = wpmark_get_inactivity_interval();Проверка результата после внедрения
Для проверки работы решения:
- Запустите вручную функцию
wpmark_delete_inactive_woocommerce_users()черезWP-CLIили php-код. - Проверьте в базе данных, что пользователи с датой регистрации и последней активностью более 6 месяцев удалены.
- Мониторьте логи ошибок и активности сайта, чтобы убедиться в отсутствии сбоев.
Пример команды WP-CLI для ручного запуска:
wp eval 'wpmark_delete_inactive_woocommerce_users();'Частые ошибки и как их исправить
- Ошибка: Пользователи не удаляются.
Причина: Неправильный SQL-запрос или отсутствие данных о последней активности.
Решение: Проверьте наличие таблицыwp_wc_customer_lookupи полеlast_active. Если поле отсутствует, можно заменить условие на дату последнего заказа изwp_postsс типомshop_order. - Ошибка: WP-Cron не запускается.
Причина: Отсутствие трафика или отключенный WP-Cron.
Решение: Настройте системный cron на сервере или используйте плагин для управления cron-задачами. - Ошибка: Удаляются активные пользователи.
Причина: Некорректная логика проверки активности.
Решение: Уточните критерии активности: например, проверяйте дату последнего заказа и дату последнего входа с помощьюget_user_meta($user_id, 'last_login', true)(нужно заранее сохранять этот мета ключ).
Практические советы по безопасности и производительности
- Перед удалением пользователей делайте резервную копию базы данных, чтобы избежать потери важных данных.
- Добавьте логирование удалений в отдельный файл для аудита.
- Для крупных баз данных запускайте удаление частями, чтобы не перегружать сервер и избежать таймаутов.
- Используйте транзакции в базе данных, если планируете расширять функционал.
Сравнение подходов: плагин vs. кастомный код vs. ручное удаление
| Метод | Преимущества | Недостатки |
|---|---|---|
| Плагин (например, WP-Optimize, Clearfy Pro) | Простота настройки, дополнительные опции оптимизации | Может нагружать сайт, не всегда точный контроль |
| Кастомный код (как в статье) | Гибкость, точный контроль, минимальные ресурсы | Требует навыков разработки, ответственность за поддержку |
| Ручное удаление через админку | Безопасно, только при малом числе пользователей | Неподходяще для больших баз, трудоемко |