Проблема: необходимость удаления пользователя после отмены заказа
В интернет-магазинах на WooCommerce иногда возникает задача удалить аккаунт пользователя сразу после отмены его заказа. Это может быть нужно, если аккаунты создаются только для совершения конкретной покупки и не предполагается дальнейшее использование. WordPress и WooCommerce по умолчанию не предоставляют такую функциональность, поэтому её нужно реализовать самостоятельно.
Диагностика задачи и анализ требований
Прежде чем приступать к коду, уточним ключевые моменты:
- Удалять нужно пользователя, связанного с отменённым заказом.
- Удаление должно происходить только при смене статуса заказа на "отменён" (
cancelled). - Необходимо учитывать, что пользователь может иметь несколько заказов — удалять только если отменён последний заказ или если других заказов нет.
- Удаление должно быть безопасным и не влиять на работу сайта.
Пошаговое решение: создание кастомного хука для удаления пользователя
WooCommerce генерирует событие при смене статуса заказа. Используем хук woocommerce_order_status_cancelled, чтобы отследить отмену заказа и удалить пользователя.
Пример кода для файла functions.php вашей темы или в собственном плагине:
add_action('woocommerce_order_status_cancelled', 'delete_user_on_order_cancelled', 10, 1);
function delete_user_on_order_cancelled($order_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
if (!$order) return;
$user_id = $order->get_user_id();
if (!$user_id) return; // Гость, пользователь не зарегистрирован
// Проверяем есть ли у пользователя другие активные/завершённые заказы
$args = [
'customer_id' => $user_id,
'status' => ['wc-processing', 'wc-completed', 'wc-on-hold'],
'exclude' => [$order_id],
'limit' => 1,
];
$orders = wc_get_orders($args);
if (empty($orders)) {
// Удаляем пользователя, так как других заказов нет
require_once ABSPATH . 'wp-admin/includes/user.php';
wp_delete_user($user_id);
}
}Объяснение кода
- Хук срабатывает при смене статуса заказа на "отменён".
- Получаем ID пользователя, связанного с заказом.
- Проверяем, есть ли у пользователя другие заказы в статусах обработки, завершён или ожидания.
- Если других заказов нет, вызываем
wp_delete_user()для удаления.
Проверка результата после внедрения
- Создайте тестовый заказ с новым пользователем.
- Перейдите в админке WooCommerce к заказу и смените статус на "Отменён".
- Проверьте в разделе "Пользователи", что аккаунт пользователя удалён.
- Если пользователь имеет другие заказы, аккаунт должен остаться.
Частые ошибки и как исправить
- Пользователь не удаляется: Проверьте, что у заказа есть связанный
user_id. Заказы гостей не имеют пользователей. - Удаляется пользователь с активными заказами: Проверьте правильность фильтра по статусам и исключения текущего заказа.
- Ошибка при удалении пользователя: Убедитесь, что подключена функция
wp_delete_user()черезrequire_onceизwp-admin/includes/user.php. - Удаление пользователя ломает сайт: Настройте резервное копирование перед внедрением и тестируйте на копии сайта.
Практические советы по безопасности и производительности
- Удаление пользователя — необратимая операция. Обязательно делайте бэкап базы перед активацией кода.
- Если на сайте много пользователей и заказов, фильтр по заказам
wc_get_ordersможет создавать нагрузку. Ограничьте количество запросов, используяlimitи проверяйте индексы в базе. - Рассмотрите вариант помечать пользователя как "неактивного" вместо удаления, чтобы избежать потери данных.
- Используйте транзакции или логи для отслеживания удалений пользователей.
Сравнение вариантов реализации автоматического удаления пользователя
| Метод | Плюсы | Минусы | Пример кода |
|---|---|---|---|
Хук woocommerce_order_status_cancelled |
Автоматизация; работает сразу при отмене заказа | Риск удаления нужных пользователей; нагрузка на БД при проверках | Пример в статье выше |
| Отдельный cron-задача для удаления | Контроль времени удаления; меньшая нагрузка в пиковые часы | Задержка удаления; сложнее в реализации | Планировщик WordPress с пользовательской функцией удаления |
| Ручное удаление админом | Максимальный контроль; минимальный риск ошибок | Требует ручной работы; неудобно на больших сайтах | Нет кода, стандартная админка WP |