WP REST API методы PUT и DELETE: особенности использования и безопасность
WordPress REST API предоставляет мощный интерфейс для взаимодействия с сайтом через HTTP-запросы. Среди основных методов HTTP, поддерживаемых REST API, особое внимание заслуживают PUT и DELETE, так как они позволяют обновлять и удалять ресурсы соответственно. Однако использование этих методов требует понимания особенностей их работы в WordPress, а также вопросов безопасности и правильной авторизации.
Особенности работы методов PUT и DELETE в WordPress REST API
Метод PUT предназначен для полного обновления ресурса. В WordPress это обычно означает замену всех полей объекта, например поста или пользователя. Метод DELETE отвечает за удаление ресурса из базы данных.
Важно помнить, что не все эндпоинты WordPress по умолчанию поддерживают PUT и DELETE. Многие из них используют PATCH для частичного обновления и POST для создания. Если вам нужно реализовать поддержку PUT и DELETE, возможно, потребуется создавать собственные эндпоинты или расширять существующие.
В стандартных эндпоинтах WordPress для обновления часто применяется метод POST с параметром _method=PUT из-за ограничений некоторых серверов или клиентов, которые не поддерживают PUT напрямую. Но при разработке собственных эндпоинтов рекомендуется использовать оригинальные HTTP методы для чистоты архитектуры и совместимости с клиентами.
Пример регистрации кастомного REST API эндпоинта с поддержкой PUT и DELETE
Рассмотрим пример создания эндпоинта для управления кастомным типом записи wpapi_item с поддержкой методов GET, PUT и DELETE.
add_action('rest_api_init', function () {
register_rest_route('wpapi/v1', '/item/(?P<id>\d+)', [
[
'methods' => 'GET',
'callback' => 'wpapi_get_item',
'permission_callback' => function () {
return current_user_can('read');
},
],
[
'methods' => 'PUT',
'callback' => 'wpapi_put_item',
'permission_callback' => function () {
return current_user_can('edit_posts');
},
],
[
'methods' => 'DELETE',
'callback' => 'wpapi_delete_item',
'permission_callback' => function () {
return current_user_can('delete_posts');
},
],
]);
});
function wpapi_get_item($request) {
$id = (int) $request['id'];
$post = get_post($id);
if (!$post || $post->post_type !== 'wpapi_item') {
return new WP_Error('not_found', 'Объект не найден', ['status' => 404]);
}
return [
'id' => $post->ID,
'title' => $post->post_title,
'content' => $post->post_content,
];
}
function wpapi_put_item($request) {
$id = (int) $request['id'];
$post = get_post($id);
if (!$post || $post->post_type !== 'wpapi_item') {
return new WP_Error('not_found', 'Объект не найден', ['status' => 404]);
}
$params = $request->get_json_params();
$update_post = [
'ID' => $id,
'post_title' => sanitize_text_field($params['title']),
'post_content' => sanitize_textarea_field($params['content']),
];
$updated_id = wp_update_post($update_post, true);
if (is_wp_error($updated_id)) {
return $updated_id;
}
return ['success' => true, 'id' => $updated_id];
}
function wpapi_delete_item($request) {
$id = (int) $request['id'];
$post = get_post($id);
if (!$post || $post->post_type !== 'wpapi_item') {
return new WP_Error('not_found', 'Объект не найден', ['status' => 404]);
}
$result = wp_delete_post($id, true);
if (!$result) {
return new WP_Error('delete_failed', 'Не удалось удалить объект', ['status' => 500]);
}
return ['success' => true];
}Авторизация и права доступа для методов PUT и DELETE
Поскольку PUT и DELETE изменяют данные, крайне важно обеспечить строгую авторизацию и проверку прав пользователя. В примере выше для каждого метода используется permission_callback, который проверяет соответствующие возможности пользователя:
- Для GET достаточно права
read. - Для PUT нужно право редактирования постов
edit_posts, так как изменяется содержимое. - Для DELETE — право удаления
delete_posts.
Если не настроить эти права, любой пользователь сможет удалять или изменять данные, что приведет к серьезным проблемам безопасности.
Также рекомендуется использовать nonce при работе через интерфейс администратора и HTTPS для защиты данных при передаче.
Использование плагинов для расширения безопасности REST API
Для дополнительной защиты REST API можно использовать плагины, которые ограничивают доступ к методам PUT и DELETE по IP, добавляют капчу или ограничивают количество запросов:
- Clearfy Pro — позволяет гибко настраивать разрешения и блокировки для REST API.
- WPRemark — имеет функционал для логирования и контроля REST API запросов.
Обработка ошибок и ответы при использовании PUT и DELETE
Важно корректно обрабатывать ошибки, чтобы клиент получал понятные ответы и мог правильно реагировать. В WordPress для этого удобно использовать класс WP_Error, возвращая его из callback функций с описанием и HTTP кодом.
Например, при попытке обновить несуществующий объект вернем 404:
return new WP_Error('not_found', 'Объект не найден', ['status' => 404]);При успешном удалении или обновлении возвращайте подтверждение, например:
return ['success' => true, 'id' => $updated_id];Так клиент сможет отследить результат операции и обработать его в интерфейсе.
Логирование запросов для аудита
Для повышения безопасности и отладки полезно вести логирование запросов PUT и DELETE. Можно реализовать простой лог в файл или использовать сторонние решения. Это поможет выявить попытки несанкционированного доступа или ошибки в работе API.
Заключение по теме использования PUT и DELETE в WP REST API
Методы PUT и DELETE являются ключевыми для полноценного CRUD через WP REST API, но требуют правильной настройки и защиты. Используйте встроенные возможности WordPress для проверки прав, обрабатывайте ошибки и при необходимости расширяйте функциональность с помощью кастомных эндпоинтов и плагинов.
Если вы хотите углубить безопасность и контроль доступа, обратите внимание на плагины из WPShop, которые помогут защитить ваш REST API и снизить риски.