Диагностика проблемы: зачем удалять неактивных клиентов в WooCommerce
С течением времени в базе WooCommerce накапливаются пользователи, которые давно не совершали покупок и не взаимодействуют с сайтом. Такие «мертвые» аккаунты увеличивают размер базы данных, замедляют работу сайта и могут создавать проблемы с рассылками и аналитикой. Важно определить, кто именно считается неактивным, и настроить автоматическое удаление таких клиентов.
Как определить неактивного клиента WooCommerce?
Критерии могут меняться в зависимости от специфики магазина, но обычно это пользователи с ролью customer, у которых не было заказов или логинов в течение длительного времени (например, 6 месяцев и более).
- Роль пользователя:
customer - Отсутствие заказов за последние 6 месяцев
- Отсутствие активности (вход на сайт) за последние 6 месяцев (если есть запись в метаданных)
Пошаговое решение: автоматическое удаление неактивных клиентов через WP-Cron
Для автоматизации процесса можно использовать WP-Cron. Ниже пример кода для functions.php или собственного плагина.
<?php
// Шаг 1: Регистрируем событие, если оно ещё не добавлено
function wpdocs_schedule_delete_inactive_customers() {
if ( ! wp_next_scheduled( 'delete_inactive_customers_hook' ) ) {
wp_schedule_event( time(), 'daily', 'delete_inactive_customers_hook' );
}
}
add_action( 'wp', 'wpdocs_schedule_delete_inactive_customers' );
// Шаг 2: Обработчик удаления
function wpdocs_delete_inactive_customers() {
global $wpdb;
$six_months_ago = date( 'Y-m-d H:i:s', strtotime( '-6 months' ) );
// Получаем ID пользователей с ролью customer
$customer_ids = $wpdb->get_col( "SELECT ID FROM {$wpdb->users} WHERE ID IN (
SELECT user_id FROM {$wpdb->usermeta} WHERE meta_key = '{$wpdb->prefix}capabilities' AND meta_value LIKE '%customer%'
)" );
foreach ( $customer_ids as $user_id ) {
// Проверяем заказы пользователя
$orders = wc_get_orders( array(
'customer_id' => $user_id,
'limit' => 1,
'orderby' => 'date',
'order' => 'DESC',
'date_created' => '>=' . $six_months_ago
) );
if ( empty( $orders ) ) {
// Дополнительно можно проверить последний логин, если у вас есть мета с датой
// Например, meta_key = 'last_login'
$last_login = get_user_meta( $user_id, 'last_login', true );
if ( $last_login && strtotime( $last_login ) < strtotime( $six_months_ago ) ) {
wp_delete_user( $user_id );
} elseif ( ! $last_login ) {
// Если нет данных по логину, удаляем по отсутствию заказов
wp_delete_user( $user_id );
}
}
}
}
add_action( 'delete_inactive_customers_hook', 'wpdocs_delete_inactive_customers' );
// Шаг 3: Для сбора данных о последнем входе можно использовать плагин или добавить код, например:
function wpdocs_track_last_login( $login, $user ) {
update_user_meta( $user->ID, 'last_login', current_time( 'mysql' ) );
}
add_action( 'wp_login', 'wpdocs_track_last_login', 10, 2 );
?>Объяснение кода
- Регистрация WP-Cron задачи на ежедневное выполнение.
- В функции удаления получаем пользователей с ролью
customer. - Проверяем заказы за последние 6 месяцев с помощью
wc_get_orders. - Дополнительно проверяем дату последнего входа, если она есть.
- Удаляем пользователя через
wp_delete_user. - Отдельный хук для записи даты последнего входа.
Проверка результата после внедрения
- Вручную выполните функцию
wpdocs_delete_inactive_customers()через WP CLI или временно вызовите ее в админке. - Проверьте, что пользователи с отсутствием заказов и логинов за 6 месяцев удалены.
- Отслеживайте логи ошибок PHP и WP-Cron для подтверждения успешного запуска задачи.
- Используйте SQL-запросы для проверки количества клиентов до и после запуска скрипта.
Частые ошибки и как их исправить
- Неправильная роль пользователя. Убедитесь, что роль действительно
customer, иногда могут быть кастомные роли. - Отсутствие даты последнего входа. Если не отслеживать логины, часть пользователей может не удаляться. Добавьте хук для записи последнего входа.
- Отсутствие прав у WP-Cron. Проверьте, что задача запускалась — для этого используйте плагин WP Crontrol.
- Неправильный формат даты или часовой пояс. Используйте
current_time('mysql')и стандартные функции WordPress для даты. - Удаление админов или других ролей. В коде фильтруйте только нужные роли.
Практические советы по безопасности и производительности
- Перед удалением пользователей делайте резервные копии базы.
- Добавьте логирование действий удаления для последующего аудита.
- Для больших баз данных делайте удаление порциями, чтобы избежать таймаутов.
- Используйте транзиенты или опции для хранения состояния процесса очистки.
- Если база большая, рассмотрите отключение WP-Cron и настройку системного cron для надежности.
Сравнение вариантов решения автоматического удаления
| Метод | Плюсы | Минусы | Компромисс |
|---|---|---|---|
| Код в functions.php + WP-Cron | Гибкость, без плагинов, полный контроль | Требует навыков, возможны ошибки при большом объеме | Удалять небольшими партиями, логировать |
| Плагины очистки базы (например, Clearfy Pro) | Удобный интерфейс, дополнительные функции оптимизации | Могут быть платными, ограниченная кастомизация | Использовать для разовых очисток, а не для постоянной автоматизации |
| Ручное удаление через админку | Простота, безопасность | Трудозатратно, не подходит для больших баз | Использовать для мелких магазинов или непериодически |