Диагностика проблемы неактивных пользователей в WooCommerce
Накопление неактивных пользователей в WooCommerce приводит к увеличению базы данных, росту нагрузки на сервер и усложнению управления клиентской базой. Неактивными считаются пользователи, которые не совершали покупок и не заходили на сайт в течение длительного времени (например, 6 месяцев и более).
Признаки проблемы:
- База пользователей растёт при отсутствии реальной активности;
- Высокий процент пользователей без заказов;
- Увеличение времени отклика сайта из-за тяжёлых запросов к таблице
wp_usersи метаданным; - Сложности с рассылками и сегментацией клиентов.
Рекомендуется регулярно очищать базу от таких пользователей, чтобы поддерживать производительность и точность маркетинговых кампаний.
Пошаговое решение: автоматическое удаление неактивных пользователей
1. Определение критериев неактивности
В нашем примере неактивный пользователь — тот, кто не входил в систему и не совершал заказов более 180 дней.
2. Создание WP-Cron задачи для периодической очистки
Добавьте следующий код в файл functions.php вашей темы или в отдельный плагин:
function wpmy_schedule_inactive_users_cleanup() {
if ( ! wp_next_scheduled( 'wpmy_clean_inactive_users_hook' ) ) {
wp_schedule_event( time(), 'daily', 'wpmy_clean_inactive_users_hook' );
}
}
add_action( 'wp', 'wpmy_schedule_inactive_users_cleanup' );
function wpmy_clean_inactive_users_callback() {
global $wpdb;
$cutoff = strtotime( '-180 days' );
$cutoff_mysql = date( 'Y-m-d H:i:s', $cutoff );
// Получаем ID пользователей, которые не заходили в систему 180+ дней
$inactive_users = $wpdb->get_col( $wpdb->prepare(
"SELECT ID FROM {$wpdb->users} u
LEFT JOIN {$wpdb->usermeta} um ON u.ID = um.user_id AND um.meta_key = 'last_login'
WHERE (um.meta_value IS NULL OR um.meta_value < %s)",
$cutoff_mysql
) );
if ( empty( $inactive_users ) ) {
return;
}
// Фильтруем пользователей, у которых нет заказов WooCommerce
$users_to_delete = [];
foreach ( $inactive_users as $user_id ) {
$orders = wc_get_orders( [
'customer_id' => $user_id,
'limit' => 1,
] );
if ( empty( $orders ) ) {
$users_to_delete[] = $user_id;
}
}
// Удаляем пользователей
foreach ( $users_to_delete as $uid ) {
require_once ABSPATH . 'wp-admin/includes/user.php';
wp_delete_user( $uid );
}
}
add_action( 'wpmy_clean_inactive_users_hook', 'wpmy_clean_inactive_users_callback' );3. Отслеживание последнего входа пользователя
WordPress по умолчанию не хранит дату последнего входа. Чтобы это сделать, добавьте следующий код:
function wpmy_track_user_last_login( $login, $user ) {
update_user_meta( $user->ID, 'last_login', current_time( 'mysql' ) );
}
add_action( 'wp_login', 'wpmy_track_user_last_login', 10, 2 );Проверка результата после внедрения
После добавления кода:
- Убедитесь, что CRON событие
wpmy_clean_inactive_users_hookзапланировано. Для этого можно использовать плагинWP Crontrolили выполнить:
print_r( wp_next_scheduled( 'wpmy_clean_inactive_users_hook' ) );- Проверьте в базе данных, что у пользователей с датой последнего входа старше 180 дней и без заказов пользователей удаляют.
- Можно вручную вызвать функцию
wpmy_clean_inactive_users_callback()для теста.
Частые ошибки и как их исправить
- Отсутствие данных о последнем входе: Если мета
last_loginне обновляется, убедитесь, что хукwp_loginактивен и код добавлен корректно. - Ошибки при удалении пользователей: Проверьте, что функция
wp_delete_userвызывается с корректным ID, и у пользователя нет связанных данных, которые блокируют удаление. - CRON задача не запускается: На некоторых хостингах WP-Cron не работает без внешних вызовов. Настройте реальный системный cron или используйте плагин для управления cron.
Практические советы по безопасности и производительности
- Перед удалением пользователей делайте резервную копию базы данных.
- Не удаляйте пользователей с активными заказами или ролью администратора.
- Оптимизируйте запросы, чтобы избежать нагруженности базы данных при большом количестве пользователей.
- Для крупных сайтов выполняйте очистку в ночное время и лимитируйте количество удалений за один запуск, чтобы не вызвать перегрузку.
Сравнение подходов к автоматическому удалению неактивных пользователей
| Метод | Плагин | Код | Компромисс |
|---|---|---|---|
| Использование плагина | WP User Manager, Cleanup Plugins | Нет | Простота настройки, но может нагружать сайт и иметь лишний функционал |
| Собственный код с WP-Cron | Нет | Да | Гибкость и точность, требует навыков, можно оптимизировать под конкретные задачи |
| Внешний скрипт + WP REST API | Нет | Да | Высокая нагрузка на сервер при больших базах, требует настройки безопасности |