Диагностика проблемы: зачем удалять неактивных пользователей в WooCommerce
В интернет-магазинах на WooCommerce с течением времени накапливается множество пользователей, которые зарегистрировались, но давно не совершали заказов. Это нагружает базу данных, затрудняет сегментацию и снижает эффективность маркетинга. Удаление таких пользователей помогает оптимизировать работу сайта и улучшить качество базы клиентов.
Проблема: как автоматизировать удаление пользователей, которые не делали заказов в течение определённого времени, например, 1 года?
Пошаговое решение: как настроить автоматическое удаление неактивных пользователей
1. Определение критериев неактивности
В нашем случае — это пользователи, у которых отсутствуют заказы за последние 365 дней.
2. Создание пользовательской функции для удаления
Добавьте следующий код в файл functions.php вашей дочерней темы или в кастомный плагин:
function wpg_delete_inactive_users_woocommerce() {
$days_inactive = 365; // количество дней неактивности
$date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days_inactive} days" ) );
// Получаем всех пользователей с ролью 'customer'
$args = array(
'role' => 'customer',
'fields' => array('ID'),
'number' => -1
);
$users = get_users($args);
foreach ($users as $user_id) {
// Получаем последний заказ пользователя
$orders = wc_get_orders(array(
'customer_id' => $user_id,
'limit' => 1,
'orderby' => 'date',
'order' => 'DESC',
'return' => 'ids',
));
if (empty($orders)) {
// Если заказов нет, можно проверить дату регистрации
$user = get_userdata($user_id);
$user_registered = $user->user_registered;
if ($user_registered < $date_threshold) {
require_once(ABSPATH . 'wp-admin/includes/user.php');
wp_delete_user($user_id);
}
} else {
// Проверяем дату последнего заказа
$last_order = wc_get_order($orders[0]);
$order_date = $last_order->get_date_created()->date('Y-m-d H:i:s');
if ($order_date < $date_threshold) {
require_once(ABSPATH . 'wp-admin/includes/user.php');
wp_delete_user($user_id);
}
}
}
}3. Запуск функции по расписанию с помощью WP-Cron
Добавьте хук для запуска функции раз в день:
// Регистрируем событие при активации темы или плагина
if (!wp_next_scheduled('wpg_delete_inactive_users_daily')) {
wp_schedule_event(time(), 'daily', 'wpg_delete_inactive_users_daily');
}
// Добавляем обработчик
add_action('wpg_delete_inactive_users_daily', 'wpg_delete_inactive_users_woocommerce');4. Очистка планировщика при деактивации
function wpg_clear_delete_inactive_users_schedule() {
$timestamp = wp_next_scheduled('wpg_delete_inactive_users_daily');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpg_delete_inactive_users_daily');
}
}
register_deactivation_hook(__FILE__, 'wpg_clear_delete_inactive_users_schedule');Проверка результата после внедрения
Чтобы удостовериться, что удаление работает корректно:
- Временно измените
$days_inactiveна 1 или 2 дня и выполните функцию вручную через WP-CLI или прямо вызвав в админке; - Проверьте, что пользователи с заказами старше этого срока удаляются;
- Убедитесь, что пользователи с недавними заказами сохраняются;
- Проверьте логи ошибок и наличие удалённых пользователей в базе данных.
Пример вызова функции вручную (для теста):
add_action('admin_init', function() {
if (current_user_can('administrator') && isset($_GET['run_delete_inactive'])) {
wpg_delete_inactive_users_woocommerce();
echo 'Удаление выполнено';
exit;
}
});После теста удалите или закомментируйте этот код.
Частые ошибки и как их исправить
- Удаляются не те пользователи: Проверьте правильность сравнения дат — дата регистрации и дата последнего заказа должны сравниваться с пороговой датой корректно.
- Функция не запускается по расписанию: Убедитесь, что WP-Cron работает (например, бывает отключен на хостингах) — можно настроить системный cron для вызова
wp-cron.php. - Пользователи с заказами удаляются: Возможно, заказы имеют статус, который не учитывается (например, черновики или отменённые). Можно добавить параметр
'status' => 'completed'вwc_get_ordersдля фильтрации. - Ошибка удаления пользователя из-за зависимостей: Проверьте, нет ли кастомных данных, которые мешают удалению. Можно сначала деактивировать плагины, управляя пользователями, чтобы исключить конфликты.
Практические советы по безопасности и производительности
- Всегда делайте резервные копии базы данных перед массовым удалением пользователей.
- Для больших баз данных запускайте удаление порционно (например, по 100 пользователей за раз), чтобы избежать таймаутов.
- Логируйте удалённые ID пользователей для возможного восстановления.
- Используйте фильтры WooCommerce для выбора статусов заказов, чтобы не удалять пользователей с активными заказами.
Сравнение вариантов удаления неактивных пользователей
| Метод | Плюсы | Минусы | Рекомендуемый сценарий |
|---|---|---|---|
| Код на PHP с WP-Cron | Полный контроль, не требует плагинов, автоматизация | Требует навыков, возможны проблемы с WP-Cron | Для опытных разработчиков, кастомные условия |
| Плагины очистки базы | Простота использования, графический интерфейс | Могут быть избыточными, меньше гибкости | Для начинающих, быстрый запуск |
| Ручное удаление через админку | Максимальная безопасность, точечное удаление | Трудозатратно, не для больших баз | Маленькие магазины, точечная очистка |