Диагностика задачи: зачем удалять пользователя при отмене заказа
В стандартном WooCommerce пользователь остается в базе независимо от статуса заказа. В некоторых бизнес-сценариях, например, при разовых заказах или ограниченных промоакциях, требуется автоматически удалять пользователя сразу после отмены заказа, чтобы не хранить лишние аккаунты. Чтобы реализовать это, нужно понять, как WooCommerce обрабатывает статусы заказов и как взаимодействовать с пользователями через хуки WordPress.
Как отследить событие отмены заказа в WooCommerce
Для выполнения автоматического удаления пользователя при отмене заказа нам нужно поймать изменение статуса заказа на cancelled. WooCommerce предоставляет хук woocommerce_order_status_cancelled, который срабатывает при смене статуса.
Пример базового подключения к хуку:
add_action('woocommerce_order_status_cancelled', 'handle_order_cancelled', 10, 1);Где handle_order_cancelled — наша функция обработки.
Извлечение пользователя из заказа
Внутри функции обработчика получаем объект заказа и пользователя, связанного с этим заказом. Стандартный метод — $order->get_user_id().
function handle_order_cancelled( $order_id ) {
$order = wc_get_order( $order_id );
if ( ! $order ) {
return;
}
$user_id = $order->get_user_id();
if ( ! $user_id ) {
return; // Заказ создан гостем
}
// Логика удаления пользователя
}Пошаговое решение: реализуем удаление пользователя
- Подключаем обработчик к хуку
woocommerce_order_status_cancelled. - Проверяем, что заказ и пользователь существуют.
- Удаляем пользователя через функцию WordPress
wp_delete_user(). - Добавляем логирование для отладки.
add_action('woocommerce_order_status_cancelled', 'wpauth_delete_user_on_order_cancelled', 10, 1);
function wpauth_delete_user_on_order_cancelled( $order_id ) {
$order = wc_get_order( $order_id );
if ( ! $order ) {
error_log("[wpauth] Заказ с ID $order_id не найден.");
return;
}
$user_id = $order->get_user_id();
if ( ! $user_id ) {
error_log("[wpauth] Заказ $order_id создан гостем, пользователь не удаляется.");
return;
}
// Проверяем роль пользователя, чтобы не удалять админов
$user = get_userdata( $user_id );
if ( in_array( 'administrator', (array) $user->roles ) ) {
error_log("[wpauth] Пользователь $user_id с ролью администратора не удалён.");
return;
}
$deleted = wp_delete_user( $user_id );
if ( $deleted ) {
error_log("[wpauth] Пользователь с ID $user_id успешно удалён после отмены заказа $order_id.");
} else {
error_log("[wpauth] Ошибка при удалении пользователя с ID $user_id.");
}
}Проверка результата после внедрения
- Создайте тестового пользователя и привяжите к нему заказ.
- В панели администратора WooCommerce отмените заказ (измените статус на Cancelled или Cancel).
- Проверьте логи
error_log(обычноwp-content/debug.logпри включенном WP_DEBUG). - Убедитесь, что пользователь удалён и не отображается в списке пользователей.
Для включения логирования добавьте в wp-config.php:
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);Частые ошибки и их исправление
- Пользователь не удаляется: Проверьте, что заказ действительно связан с пользователем. Заказы гостей не имеют user_id.
- Удаляются администраторы: Добавьте проверку роли, чтобы не удалять пользователей с правами администратора.
- Отсутствие логов: Убедитесь, что включено WP_DEBUG и WP_DEBUG_LOG.
- Нарушение бизнес-логики: Если заказ может быть восстановлен, лучше не удалять пользователя сразу, а использовать флаг или отложенное удаление.
Практические советы по безопасности и производительности
- Резервное копирование: Перед массовым удалением пользователей убедитесь в наличии актуальной резервной копии базы данных.
- Проверка ролей: Никогда не удаляйте администраторов и ключевых пользователей.
- Обработка ошибок: Добавляйте логирование, чтобы отслеживать случаи удаления и возможные ошибки.
- Оптимизация: Если на сайте много заказов, рассмотрите вариант пакетной обработки и отложенного удаления через WP-Cron.
Сравнение вариантов реализации
| Вариант | Код | Плюсы | Минусы |
|---|---|---|---|
Удаление по хуку woocommerce_order_status_cancelled | Пример из статьи выше | Простая реализация, моментальное удаление | Риск удаления важных пользователей, без отложенной проверки |
| Отложенное удаление через WP-Cron | Создать задачу, которая удаляет пользователей с отменёнными заказами через сутки | Безопаснее, можно отменить удаление | Сложнее в реализации, требует мониторинга WP-Cron |
| Отметка пользователя как неактивного | Добавить мета-поле 'inactive' вместо удаления | Безопасность, возможность восстановления | Пользователь не удаляется, требует дополнительной логики |