Диагностика проблемы с базой клиентов WooCommerce
В интернет-магазинах на WooCommerce со временем накапливаются тысячи пользователей, которые не совершают покупки и не взаимодействуют с сайтом. Это утяжеляет базу данных и может замедлять работу сайта, особенно при выполнении запросов к таблице пользователей и заказов.
Чтобы проверить, насколько актуальна база клиентов, выполните SQL-запрос для подсчёта пользователей без заказов:
SELECT COUNT(DISTINCT u.ID) AS inactive_users_count
FROM wp_users u
LEFT JOIN wp_wc_customer_lookup cl ON u.ID = cl.user_id
WHERE cl.user_id IS NULL;
Если число неактивных клиентов велико (тысячи и более), стоит задуматься об их удалении, чтобы оптимизировать базу.
Пошаговое решение: автоматическое удаление неактивных клиентов
1. Определяем критерии неактивности
Оптимальным считается удалять пользователей, которые не совершали ни одного заказа и не заходили на сайт более 1 года.
2. Создаём кастомную функцию для удаления пользователей
Добавьте следующий код в файл functions.php вашей дочерней темы или в кастомный плагин:
function wc_delete_inactive_customers() {
global $wpdb;
$one_year_ago = date('Y-m-d H:i:s', strtotime('-1 year'));
// Получаем ID пользователей без заказов и с датой последнего входа более года назад
$user_ids = $wpdb->get_col($wpdb->prepare(
"SELECT u.ID FROM {$wpdb->users} u
LEFT JOIN wp_wc_customer_lookup cl ON u.ID = cl.user_id
LEFT JOIN {$wpdb->usermeta} um ON um.user_id = u.ID AND um.meta_key = 'last_login'
WHERE cl.user_id IS NULL
AND (um.meta_value IS NULL OR um.meta_value < %s)",
$one_year_ago
));
if (empty($user_ids)) {
return 'No inactive users found';
}
foreach ($user_ids as $user_id) {
require_once(ABSPATH . 'wp-admin/includes/user.php');
wp_delete_user($user_id);
}
return count($user_ids) . ' inactive users deleted';
}
Обратите внимание, что для хранения времени последнего входа нужен плагин или кастомный код, который записывает last_login в usermeta. Если такого нет, критерий по дате последнего входа можно убрать.
3. Настраиваем автоматический запуск через WP-Cron
Добавьте задачу, которая будет запускать удаление раз в месяц:
if (!wp_next_scheduled('wc_delete_inactive_customers_cron')) {
wp_schedule_event(time(), 'monthly', 'wc_delete_inactive_customers_cron');
}
add_action('wc_delete_inactive_customers_cron', 'wc_delete_inactive_customers');
Проверка результата после внедрения
- Зайдите в админку WordPress → Пользователи и проверьте количество клиентов.
- Выполните SQL-запрос из раздела диагностики до и после запуска функции.
- Для теста запустите функцию вручную, вызвав
wc_delete_inactive_customers();через консоль WP-CLI или подключив вызов на страницу с админским доступом.
Частые ошибки и как их исправлять
- Ошибка: Нельзя удалить пользователя, если он авторизован или есть связанные данные.
Решение: Убедитесь, чтоwp_delete_user()вызывается корректно и нет зависимостей (заказы, права). - Ошибка: Нет записи
last_loginв usermeta.
Решение: Либо добавьте плагин для отслеживания логинов, либо уберите проверку даты из условия. - Ошибка: WP-Cron не срабатывает.
Решение: Проверьте, что на сервере посещения сайта есть, либо настройте системный cron для wp-cron.php.
Практические советы по безопасности и производительности
- Перед удалением пользователей сделайте полный бэкап базы данных.
- Удаляйте только пользователей без заказов, чтобы не потерять критичные данные.
- Для больших баз используйте пакетную обработку, чтобы избежать таймаутов. Например, обрабатывать по 100 пользователей за раз.
- Для записи даты последнего входа используйте проверенный плагин, например WP Last Login.
Сравнение вариантов удаления неактивных клиентов
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Ручное удаление через админку | Простота, контроль | Трудозатратно, долго | Малое количество неактивных пользователей |
| Кастомный код с WP-Cron | Автоматизация, масштабируемость | Требует навыков программирования, настройка расписания | Средние и большие магазины |
| Плагины очистки базы (например, Clearfy Pro) | Широкие возможности оптимизации | Может быть избыточно, платные версии | Комплексная оптимизация сайта |