wpmoney.ru wordpress WP Money

Автоматическое удаление неактивных пользователей WooCommerce по дате последнего входа

Диагностика проблемы: зачем удалять неактивных пользователей WooCommerce

В интернет-магазинах на WooCommerce база пользователей часто разрастается за счёт неактивных аккаунтов — зарегистрированных, но не совершавших вход или покупки длительное время. Это создаёт нагрузку на базу данных, замедляет бэкапы и анализ, а также может влиять на безопасность. Удаление таких пользователей улучшит производительность и безопасность сайта.

Как определить неактивных пользователей

Основной критерий — дата последнего входа пользователя. WooCommerce и WordPress по умолчанию не сохраняют дату последнего входа, поэтому её нужно фиксировать самостоятельно.

Пошаговое решение: реализация автоматического удаления

1. Сохранение даты последнего входа пользователя

Добавим код в functions.php темы или в кастомный плагин, чтобы при каждом логине записывать метаданные с датой последнего входа:

function wpmoney_update_last_login($user_login, $user) {
    update_user_meta($user->ID, 'last_login', current_time('mysql'));
}
add_action('wp_login', 'wpmoney_update_last_login', 10, 2);

2. Скрипт для удаления неактивных пользователей

Создадим функцию, которая ищет пользователей, не заходивших более 180 дней (6 месяцев), и удаляет их. Для запуска можно использовать WP-Cron или запускать вручную.

function wpmoney_delete_inactive_users() {
    $threshold = date('Y-m-d H:i:s', strtotime('-180 days'));

    $args = [
        'meta_key' => 'last_login',
        'meta_value' => $threshold,
        'meta_compare' => '<',
        'fields' => 'ID',
        'number' => 100,
    ];

    $user_query = new WP_User_Query($args);
    $user_ids = $user_query->get_results();

    if (!empty($user_ids)) {
        foreach ($user_ids as $user_id) {
            wp_delete_user($user_id);
        }
    }
}

3. Автоматизация с помощью WP-Cron

Добавим событие, чтобы запускать скрипт раз в неделю:

if (!wp_next_scheduled('wpmoney_weekly_delete_inactive_users')) {
    wp_schedule_event(time(), 'weekly', 'wpmoney_weekly_delete_inactive_users');
}

add_action('wpmoney_weekly_delete_inactive_users', 'wpmoney_delete_inactive_users');

Проверка результата после внедрения

Чтобы убедиться, что всё работает корректно:

  • Войдите под тестовым пользователем и проверьте, что у него в метаданных last_login обновилась дата (через phpMyAdmin или плагин для работы с базой).
  • Создайте тестового пользователя с датой входа в базе более 180 дней назад.
  • Вызовите функцию удаления вручную из консоли WP-CLI wp eval 'wpmoney_delete_inactive_users();' или временно вызовите её из админки.
  • Проверьте, что указанные пользователи удалены из базы.

Частые ошибки и как их исправить

  • Дата последнего входа не сохраняется: проверьте, что хук wp_login подключён, и функция wpmoney_update_last_login не содержит ошибок.
  • Удаляются не все неактивные пользователи: WP_User_Query по умолчанию возвращает максимум 100 пользователей, увеличьте параметр number или реализуйте пагинацию.
  • Удаление пользователей с важными правами: добавьте фильтр по ролям, чтобы исключить администраторов и важных пользователей из удаления.
  • WP-Cron не срабатывает: проверьте, работает ли WP-Cron на хостинге или настройте системный cron для вызова wp-cron.php.

Практические советы по безопасности и производительности

  • Перед удалением пользователей сделайте резервную копию базы данных.
  • Добавьте логирование удалённых пользователей в отдельный файл для аудита.
  • Обрабатывайте удаление порциями, чтобы избежать превышения времени выполнения скрипта.
  • Исключайте пользователей с ролью administrator из автоматического удаления:
function wpmoney_delete_inactive_users() {
    $threshold = date('Y-m-d H:i:s', strtotime('-180 days'));

    $args = [
        'meta_key' => 'last_login',
        'meta_value' => $threshold,
        'meta_compare' => '<',
        'fields' => 'ID',
        'number' => 100,
        'role__not_in' => ['administrator'],
    ];

    $user_query = new WP_User_Query($args);
    $user_ids = $user_query->get_results();

    if (!empty($user_ids)) {
        foreach ($user_ids as $user_id) {
            wp_delete_user($user_id);
        }
    }
}

Сравнение вариантов удаления пользователей

МетодПлюсыМинусы
Удаление вручную из админкиПростота, контрольТрудозатратно, нельзя по дате входа
Плагины очистки пользователейАвтоматизация, удобный интерфейсМожет не учитывать дату последнего входа, нагрузка на сайт
Кастомный код с WP-CronТочный контроль, гибкость, безопасностьТребует навыков программирования
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше