WooCommerce: автоматическое отключение неактивных аккаунтов клиентов

Диагностика проблемы: почему нужно отключать неактивные аккаунты в WooCommerce

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

Как определить неактивные аккаунты в WooCommerce

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

Добавляем запись даты последнего входа пользователя

Для этого используем хук wp_login, чтобы сохранять мета-данные при каждом входе пользователя:

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

Этот код помещаем в functions.php темы или в отдельный плагин для кастомных функций.

Пошаговое решение: автоматическое отключение неактивных аккаунтов

Далее пишем функцию, которая будет отключать пользователей, не входивших в систему, например, более 180 дней.

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

function deactivate_inactive_users() {
    $days_inactive = 180; // количество дней неактивности
    $date_threshold = date( 'Y-m-d H:i:s', strtotime( "-{$days_inactive} days" ) );

    $args = array(
        'meta_key' => 'last_login',
        'meta_value' => $date_threshold,
        'meta_compare' => '<',
        'fields' => 'ID',
    );

    $user_query = new WP_User_Query( $args );

    if ( ! empty( $user_query->results ) ) {
        foreach ( $user_query->results as $user_id ) {
            // Отключаем пользователя
            update_user_meta( $user_id, 'account_status', 'deactivated' );

            // Регистрируем стандартный user meta для блокировки
            wp_update_user( array( 'ID' => $user_id, 'role' => '' ) );
        }
    }
}

// Запускаем очистку через WP-Cron
if ( ! wp_next_scheduled( 'deactivate_inactive_users_daily' ) ) {
    wp_schedule_event( time(), 'daily', 'deactivate_inactive_users_daily' );
}

add_action( 'deactivate_inactive_users_daily', 'deactivate_inactive_users' );

В этом коде мы ищем пользователей, у которых дата последнего входа раньше пороговой даты и отключаем их, удаляя роли.

Блокировка входа для отключенных аккаунтов

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

function block_deactivated_users( $user, $username, $password ) {
    $status = get_user_meta( $user->ID, 'account_status', true );
    if ( 'deactivated' === $status ) {
        return new WP_Error( 'deactivated_account', __( 'Ваш аккаунт отключен из-за длительной неактивности.' ) );
    }
    return $user;
}
add_filter( 'authenticate', 'block_deactivated_users', 30, 3 );

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

  • Зайдите в базу данных и проверьте, что у пользователей с датой последнего входа более 180 дней появилась мета 'account_status' со значением 'deactivated'.
  • Попробуйте войти под отключенным аккаунтом — должен быть показан блокирующий текст.
  • Просмотрите журнал WP-Cron, чтобы убедиться, что задача запускается ежедневно.

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

  • Отсутствие даты последнего входа: без сохранения даты входа функция не сможет определить неактивных пользователей. Проверьте, что хук wp_login корректно работает.
  • Удаление ролей не блокирует вход: некоторые плагины могут переопределять поведение ролей. Используйте фильтр authenticate, как показано выше, чтобы гарантированно блокировать вход.
  • WP-Cron не запускается: на некоторых серверах WP-Cron требует внешнего вызова, настройте системный cron или используйте плагин для мониторинга задач.

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

  • Не просто удаляйте роли, а используйте отдельное мета поле для статуса — так проще управлять аккаунтами вручную, не удаляя данные.
  • Регулярно очищайте базу от неактивных учетных записей, чтобы уменьшить нагрузку.
  • Для магазинов с большим числом пользователей рассмотрите вариант использования сторонних сервисов или плагинов для управления клиентскими аккаунтами с расширенными функциями.

Сравнение вариантов решения

МетодПлюсыМинусыРекомендации
Добавление last_login через хук + WP-Cron отключениеПолный контроль, бесплатное решение, можно кастомизироватьТребует настройки WP-Cron, кодовая поддержкаДля разработчиков, подходит для сайтов с малым и средним числом пользователей
Готовые плагины управления пользователямиБыстрое внедрение, дополнительные функции (уведомления, отчеты)Платные, может быть избыточноДля крупных магазинов или при отсутствии времени на разработку
Как сделать автоматический импорт из XML в WordPress
08.03.2026
WooCommerce: как автоматически удалить товар при отсутствии на складе
18.05.2026
Как избежать проблем с сериализацией в WordPress meta полях
05.01.2026
Как использовать WP-Cron для автоматизации задач в WordPress
19.04.2026
WooCommerce: автоматическое удаление товаров при отсутствии на складе
18.07.2026

Совсем скоро здесь откроется ресурс о вордпресс.