В процессе администрирования WordPress часто возникает необходимость удалять пользователей не только вручную через панель администратора, но и программно, например, при интеграции с внешними системами или при автоматизации задач. В этой статье подробно рассмотрим, как реализовать удаление пользователя WordPress через удалённый запрос (REST API или AJAX), с учётом безопасности и правильной обработки ошибок.
Почему удаление пользователя через удалённый запрос полезно
Удалённое удаление пользователей позволяет автоматически синхронизировать базу пользователей с внешними сервисами, реализовать кастомные панели управления или административные инструменты без входа в стандартную админку. Это удобно для мультисайтов, корпоративных порталов и интеграций с CRM.
Однако такой функционал требует тщательной настройки безопасности, чтобы избежать злоупотреблений и случайного удаления данных.
Создание REST API эндпоинта для удаления пользователя
WordPress с версии 4.7 включает REST API, который позволяет создавать свои собственные эндпоинты. Для удаления пользователя создадим кастомный маршрут с проверкой прав.
Регистрация маршрута и обработчика запроса
Добавим следующий код в файл functions.php вашей темы или в кастомный плагин:
add_action('rest_api_init', function () {
register_rest_route('wpauth/v1', '/delete-user/(?P<id>\d+)', array(
'methods' => 'DELETE',
'callback' => 'wpauth_delete_user_callback',
'permission_callback' => 'wpauth_delete_user_permissions_check',
));
});
function wpauth_delete_user_permissions_check(WP_REST_Request $request) {
return current_user_can('delete_users');
}
function wpauth_delete_user_callback(WP_REST_Request $request) {
$user_id = (int) $request['id'];
if (!get_userdata($user_id)) {
return new WP_Error('user_not_found', 'Пользователь не найден', array('status' => 404));
}
if (!wp_delete_user($user_id)) {
return new WP_Error('delete_failed', 'Не удалось удалить пользователя', array('status' => 500));
}
return array('message' => 'Пользователь успешно удалён', 'user_id' => $user_id);
}Этот код создаёт REST API маршрут /wp-json/wpauth/v1/delete-user/{id}, который принимает DELETE запрос с ID пользователя для удаления.
Пояснения к коду
wpauth_delete_user_permissions_checkпроверяет, что текущий пользователь имеет право удалять пользователей. Это важно для безопасности.wpauth_delete_user_callbackпроверяет существование пользователя, пытается удалить и возвращает результат.- Используется встроенная функция
wp_delete_user(), которая корректно удаляет пользователя и все связанные данные.
Безопасность при удалённом удалении пользователей
Очень важно, чтобы доступ к этому API имели только доверенные пользователи. Вот рекомендации по защите:
- Используйте аутентификацию через cookie (если вызов идёт с фронтенда) или через OAuth / JWT токены при интеграции с внешними сервисами.
- Проверяйте права пользователя через
current_user_can('delete_users'). - Ограничивайте доступ к API например по IP или другим параметрам, если это возможно.
- Логируйте удаление пользователей для аудита.
Пример вызова REST API для удаления пользователя
Если вы используете JavaScript, то удаление пользователя с ID 25 через fetch выглядит так:
fetch('/wp-json/wpauth/v1/delete-user/25', {
method: 'DELETE',
credentials: 'same-origin', // чтобы передавались куки
headers: {
'X-WP-Nonce': wpauth_api_nonce // nonce для проверки безопасности
}
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Ошибка:', error));Для работы nonce нужно локализовать скрипт в PHP и передать nonce:
wp_localize_script('your-script-handle', 'wpauth_api_nonce', wp_create_nonce('wp_rest'));Альтернатива: удаление пользователя через AJAX в админке
Если нужно сделать удаление пользователя через AJAX в административной панели, можно использовать стандартный AJAX API WordPress.
Пример реализации AJAX удаления пользователя
add_action('wp_ajax_wpauth_delete_user', 'wpauth_delete_user_ajax_callback');
function wpauth_delete_user_ajax_callback() {
if (!current_user_can('delete_users')) {
wp_send_json_error('Нет прав для удаления пользователей');
}
$user_id = isset($_POST['user_id']) ? intval($_POST['user_id']) : 0;
if (!$user_id || !get_userdata($user_id)) {
wp_send_json_error('Пользователь не найден');
}
if (wp_delete_user($user_id)) {
wp_send_json_success('Пользователь успешно удалён');
} else {
wp_send_json_error('Ошибка при удалении пользователя');
}
}В JS отправляем AJAX запрос:
jQuery.post(ajaxurl, {
action: 'wpauth_delete_user',
user_id: 25,
_ajax_nonce: wpauth_ajax_nonce
}, function(response) {
if (response.success) {
alert(response.data);
} else {
alert('Ошибка: ' + response.data);
}
});Не забудьте добавить nonce и локализовать скрипт в PHP:
wp_localize_script('your-script-handle', 'wpauth_ajax_nonce', wp_create_nonce('wpauth_delete_user_nonce'));Обработка ошибок и уведомления
При удалении пользователя важно корректно обрабатывать ошибки. Например, если пользователь не найден, возвращать 404. Если нет прав — 403. Это помогает фронтенду правильно реагировать и показывать пользователю информативные сообщения.
Также рекомендуется делать подтверждение удаления, чтобы избежать случайных удалений.
Выводы и рекомендации
Удаление пользователей WordPress через удалённые запросы — мощный инструмент для автоматизации и интеграций. Главное — обеспечить безопасность и правильную обработку ошибок.
Используйте REST API с проверкой прав и nonce, логируйте действия и тестируйте на тестовом сайте перед применением в продакшене.
Если нужна более сложная логика удаления (например, перенос контента на другого пользователя), то используйте дополнительные параметры и расширяйте callback функции.