wpdownload.ru wordpress WPDownload.ru

WooCommerce: автоматическое отключение неактивных клиентов с помощью хуков и функций

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

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

Как определить неактивного клиента

  • Отсутствие заказов за определённый период (например, 6 месяцев).
  • Отсутствие входа в аккаунт за этот же период.
  • Отсутствие активности на сайте (комментарии, просмотры, если ведётся учёт).

Для большинства случаев достаточно проверять дату последнего заказа и дату последнего логина.

Пошаговое решение: автоматическое отключение пользователей с помощью крон-задачи и хуков

1. Добавление пользовательского крона

Создадим собственное событие, которое будет запускаться ежедневно и проверять пользователей.

add_filter('cron_schedules', function($schedules) {
    if (!isset($schedules['daily'])) {
        $schedules['daily'] = [
            'interval' => 86400, // 24 часа
            'display' => __('Каждый день')
        ];
    }
    return $schedules;
});

if (!wp_next_scheduled('wpd_deactivate_inactive_customers')) {
    wp_schedule_event(time(), 'daily', 'wpd_deactivate_inactive_customers');
}

2. Обработка отключения пользователей

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

add_action('wpd_deactivate_inactive_customers', function() {
    $inactive_days = 180;
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$inactive_days} days"));

    $args = [
        'role' => 'customer',
        'meta_query' => [
            'relation' => 'OR',
            [
                'key' => 'last_login',
                'value' => $date_threshold,
                'compare' => '<=',
                'type' => 'DATETIME'
            ],
            [
                'key' => '_last_order_date',
                'value' => $date_threshold,
                'compare' => '<=',
                'type' => 'DATETIME'
            ]
        ],
        'fields' => 'ID',
        'number' => -1
    ];

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

    foreach ($users as $user_id) {
        $user = new WP_User($user_id);
        // Меняем роль
        $user->set_role('inactive_customer');
    }
});

3. Отслеживание времени последнего входа и заказа

Для работы кода нам нужно сохранять дату последнего входа и последнего заказа пользователя. Для этого используем следующие хуки:

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

add_action('woocommerce_thankyou', function($order_id) {
    $order = wc_get_order($order_id);
    $user_id = $order->get_user_id();
    if ($user_id) {
        update_user_meta($user_id, '_last_order_date', current_time('mysql'));
    }
});

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

  • Проверьте наличие запланированного задания в разделе «Инструменты» – «Cron Events» (если установлен плагин WP Crontrol).
  • Создайте тестового пользователя с ролью customer и без активности более 180 дней (можно вручную установить мета-данные last_login и _last_order_date на дату старше 180 дней).
  • Запустите событие крон вручную через WP Crontrol или временно вызовите функцию напрямую.
  • Проверьте, что роль пользователя изменилась на inactive_customer.

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

  • Роль inactive_customer не создана: добавьте её в WordPress с помощью add_role перед использованием.
  • Пользователи не деактивируются: проверьте, что мета-данные last_login и _last_order_date обновляются корректно.
  • Крон не запускается: на хостинге может быть отключён WP-Cron. Настройте системный cron на вызов wp-cron.php.
  • Неверный формат даты в запросе: используйте current_time('mysql') для сохранения даты в формате MySQL.

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

  • Создавайте отдельную роль inactive_customer с минимальными правами, чтобы избежать случайного доступа.
  • Добавьте логирование отключений в отдельный файл или системный журнал для аудита.
  • Для больших баз данных используйте WP_User_Query с пагинацией, чтобы не превышать лимит памяти.
  • Оптимизируйте запросы и хранение даты последнего входа через мета-данные, чтобы избежать дополнительных нагрузок.

Сравнение способов реализации

МетодПлюсыМинусыКомпромисс
Плагин автоматической очистки клиентовПростой запуск, готовое решениеМожет быть тяжеловесным, не всегда гибкийИспользовать для небольших сайтов
Своя реализация на хуках и WP-CronПолный контроль, кастомизацияНужны знания разработки, настройка cronОптимально для крупных и уникальных проектов
Ручное отключение через админкуПростота, без кодаТрудозатратно, не автоматизированоПодходит для мелких магазинов
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее