Диагностика проблемы с заблокированными и неактивными пользователями в WooCommerce
В интернет-магазинах на WooCommerce с течением времени накапливается большое количество пользователей, которые либо заблокированы, либо неактивны (не совершали покупок и не посещали сайт длительное время). Это влияет на производительность сайта, объем базы данных и корректность аналитики. Стандартных инструментов WordPress для массового удаления таких пользователей недостаточно, особенно если нужно учитывать условия активности или статус блокировки, заданный кастомными мета-полями.
Как определить заблокированных и неактивных пользователей?
- Заблокированные пользователи обычно имеют специальное мета-поле, например
blockedилиaccount_statusс соответствующим значением. - Неактивные пользователи
Пошаговое решение удаления заблокированных и неактивных пользователей без плагинов
1. Проверка наличия мета-поля для блокировки
Первым делом убедитесь, что у пользователей есть мета-поле, указывающее на блокировку. Например, в базе данных в таблице wp_usermeta должно присутствовать поле meta_key='blocked' с meta_value='1'.
SELECT user_id FROM wp_usermeta WHERE meta_key = 'blocked' AND meta_value = '1';2. Поиск неактивных пользователей по дате последнего заказа
Для определения неактивных пользователей можно использовать связь с заказами WooCommerce. Таблица wp_posts содержит заказы с типом shop_order, а поле post_author — ID пользователя.
SELECT u.ID, MAX(p.post_date) AS last_order_date
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 last_order_date < DATE_SUB(NOW(), INTERVAL 6 MONTH) OR last_order_date IS NULL;Этот запрос вернет пользователей, у которых не было заказов за последние 6 месяцев или никогда не было.
3. Удаление пользователей по критериям
Для удаления пользователей используйте функцию WordPress wp_delete_user(), которая корректно удалит пользователя и связанные данные.
function delete_blocked_and_inactive_users() {
global $wpdb;
// Получаем ID заблокированных пользователей
$blocked_user_ids = $wpdb->get_col("SELECT user_id FROM {$wpdb->usermeta} WHERE meta_key = 'blocked' AND meta_value = '1'");
// Получаем ID пользователей без заказов последние 6 месяцев или без заказов вообще
$inactive_user_ids = $wpdb->get_col(
"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 6 MONTH) OR MAX(p.post_date) IS NULL"
);
// Объединяем и фильтруем уникальные ID пользователей
$user_ids_to_delete = array_unique(array_merge($blocked_user_ids, $inactive_user_ids));
foreach ($user_ids_to_delete as $user_id) {
wp_delete_user($user_id);
}
}
// Запуск функции
delete_blocked_and_inactive_users();Запустите этот код в функции темы или в плагине на время, после выполнения удалите или закомментируйте.
Проверка результата после внедрения
- Через phpMyAdmin или другой инструмент базы данных проверьте, что в таблице
wp_usersнет заблокированных и неактивных пользователей. - В админке WordPress проверьте количество пользователей и убедитесь, что количество уменьшилось по сравнению с предыдущим значением.
- Проверьте логи ошибок и журнал активности сервера на предмет ошибок при удалении.
Частые ошибки и как их исправить
- Ошибка: Удаляются пользователи, которые должны быть активны.
Причина: Неправильный критерий даты или мета-поля.
Решение: Проверьте запросы в базе и значения мета-полей, уточните период неактивности. - Ошибка: Функция
wp_delete_user()не удаляет связанные данные.
Причина: Удаление не учитывает кастомные таблицы или метаданные плагинов.
Решение: Добавьте дополнительные удаления для пользовательских данных плагинов. - Ошибка: Код вызывает нагрузку на базу данных.
Причина: Запросы не оптимизированы или код запускается часто.
Решение: Запускайте код вручную или через WP-CLI, разбивайте удаление на части.
Практические советы по безопасности и производительности
- Резервное копирование базы данных перед массовым удалением.
- Используйте WP-CLI для выполнения скрипта удаления — это безопаснее и эффективнее.
- Ограничьте удаление пользователям с ролью выше клиента (например, не трогайте администраторов).
- Периодически проверяйте и очищайте базу данных от устаревших мета-данных пользователей.
- Добавьте логирование удалений для аудита.
Сравнение вариантов удаления пользователей
| Метод | Плюсы | Минусы |
|---|---|---|
| Ручное удаление через админку | Просто, не требует кода | Трудоемко, нельзя фильтровать по активности |
| Использование плагинов | Удобный интерфейс, фильтры | Дополнительные ресурсы, возможные конфликты |
| Код с использованием wp_delete_user() | Полный контроль, гибкость | Требует навыков, возможные ошибки при некорректном коде |