wpmake.ru wordpress WPMake

Как удалить гостевого пользователя из WooCommerce после оформления заказа

Проблема: накопление гостевых пользователей в базе WooCommerce

WooCommerce по умолчанию создает учетные записи пользователей для каждого покупателя, даже если они оформляют заказ без регистрации (гостевой заказ). В некоторых случаях это приводит к тому, что база данных пользователей разрастается ненужными записями, затрудняя управление и замедляя работу сайта.

Диагностика проблемы

Чтобы понять, есть ли у вас проблема с гостевыми пользователями, выполните следующие шаги:

  • Перейдите в раздел «Пользователи» в админке WordPress и отсортируйте по дате регистрации.
  • Проверьте, сколько пользователей зарегистрировалось без дополнительной активности (без заказов, комментариев и прочего).
  • Сравните с количеством гостевых заказов в WooCommerce.

Если число пользователей значительно превышает количество активных покупателей, вероятно, у вас накопились «пустые» гостевые учетные записи.

Причина создания гостевых пользователей

WooCommerce создает пользователей при оформлении заказа, если выбрана опция Создать учетную запись при оформлении или если в настройках включена регистрация пользователей. Иногда плагины для оптимизации регистрации или кастомизации оформления заказа могут менять поведение, что приводит к автоматическому созданию пользователей для гостей.

Пошаговое решение: удаление гостевых пользователей, связанных с заказами

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

  1. Определить пользователей без ролей или с ролью customer, которые не имеют активных заказов.
  2. Удалить их из базы, не затрагивая клиентов с активными заказами.

Ниже пример функции для удаления таких пользователей по дате регистрации, чтобы не затронуть новых клиентов:

function delete_guest_customers_without_orders($days = 30) {
    $date_limit = date('Y-m-d H:i:s', strtotime("-{$days} days"));
    $args = array(
        'role' => 'customer',
        'date_query' => array(
            'before' => $date_limit
        ),
        'number' => -1
    );
    $users = get_users($args);
    foreach ($users as $user) {
        $orders = wc_get_orders(array(
            'customer_id' => $user->ID,
            'limit' => 1
        ));
        if (empty($orders)) {
            wp_delete_user($user->ID);
        }
    }
}

Используйте функцию с осторожностью, например, вызвав её через админский хук или WP-CLI:

delete_guest_customers_without_orders(60); // удалит пользователей без заказов старше 60 дней

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

  • Проверьте количество пользователей в админке после запуска функции.
  • Убедитесь, что пользователи с заказами остались.
  • Выполните тестовый заказ как гость и проверьте, создается ли пользователь (при необходимости отключите регистрацию в настройках WooCommerce).

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

  • Удаление пользователей с активными заказами. Проверьте логику выборки заказов, используйте wc_get_orders с параметрами фильтрации по ID пользователя.
  • Удаление пользователей с ролью не «customer». Убедитесь, что фильтруете по нужной роли, чтобы не удалить админов или редакторов.
  • Функция не срабатывает из-за кэширования. Отключите кэширование при тестах или очищайте кэш.
  • Пользователи создаются при оформлении заказа, несмотря на отключение регистрации. Проверьте настройки WooCommerce в «Аккаунты и конфиденциальность» и отключите автоматическую регистрацию.

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

  • Создавайте резервную копию базы данных перед массовым удалением пользователей.
  • Используйте WP-CLI для запуска подобных задач, чтобы избежать таймаутов и нагрузки на сайт.
  • Отключите регистрацию пользователей для гостей, если она не нужна, в настройках WooCommerce (Настройки → Аккаунты и конфиденциальность → «Разрешить регистрацию...»).
  • Периодически очищайте базу от неактивных пользователей, чтобы уменьшить нагрузку и ускорить бэкапы.

Сравнение способов удаления гостевых пользователей

МетодОписаниеПлюсыМинусы
Ручное удаление через админкуПоиск пользователей и удаление вручнуюПросто, без кодаДолго, риск ошибок, нет фильтрации по заказам
Кодовая функция (пример выше)Автоматизированное удаление через PHPТочно удаляет без заказов, можно запускать по расписаниюТребует навыков и осторожности
Плагины для управления пользователямиПлагины с фильтрами и массовыми действиямиУдобный интерфейс, дополнительный функционалМогут создавать нагрузку, не всегда учитывают заказы
×
Сделай свой сайт крутым!

Скидка -20% на премиум плагины WordPress

Выбрать плагин сейчас ⋙