REST API в WordPress позволяет работать с данными сайта через удобный интерфейс, но по умолчанию не все поля доступны для публичного запроса. Часто возникает задача показать в API приватные метаполя, которые должны быть доступны только авторизованным пользователям или администраторам. В этой статье разберём, как правильно добавить приватные поля в REST API WordPress, сохранив безопасность и контролируя доступ.
Что такое приватные поля в REST API WordPress
В WordPress под приватными полями обычно понимают метаданные (custom fields), которые не должны быть видны всем пользователям сайта. Например, внутренние заметки, служебные флаги или данные, которые используются только в админке или для интеграций. При запросах через REST API эти данные по умолчанию не выводятся, чтобы не раскрывать чувствительную информацию.
Однако бывают случаи, когда необходимо предоставить эти данные, но только определённым ролям или при наличии авторизации. Правильное добавление таких полей в REST API требует написания кода с проверкой прав доступа.
Как добавить приватное поле в REST API с проверкой доступа
Для примера добавим метаполе _wpsnippets_private_note к записям типа post. Это поле будет доступно только авторизованным пользователям с правом редактирования записи.
Используем хук rest_api_init и функцию register_rest_field:
add_action('rest_api_init', function() {
register_rest_field('post', 'wpsnippets_private_note', [
'get_callback' => 'wpsnippets_get_private_note',
'update_callback' => 'wpsnippets_update_private_note',
'schema' => [
'description' => 'Приватная заметка',
'type' => 'string',
'context' => ['view', 'edit'],
],
]);
});
function wpsnippets_get_private_note($object, $field_name, $request) {
$post_id = $object['id'];
if (!current_user_can('edit_post', $post_id)) {
return null; // Отказ в доступе
}
return get_post_meta($post_id, '_wpsnippets_private_note', true);
}
function wpsnippets_update_private_note($value, $post, $field_name) {
if (!current_user_can('edit_post', $post->ID)) {
return new WP_Error('rest_forbidden', 'Доступ запрещён', ['status' => 403]);
}
if (!is_string($value)) {
return new WP_Error('rest_invalid_param', 'Неверный тип данных', ['status' => 400]);
}
return update_post_meta($post->ID, '_wpsnippets_private_note', sanitize_text_field($value));
}
В этом коде мы регистрируем новое поле wpsnippets_private_note для типа записи post. Функция wpsnippets_get_private_note проверяет, может ли текущий пользователь редактировать запись, и, если да, возвращает значение метаполя. Аналогично функция wpsnippets_update_private_note проверяет права и обновляет значение.
Проверка и отладка доступа к приватным полям
Чтобы протестировать, как работает доступ, можно использовать инструменты типа Postman или curl. Пример запроса на получение приватного поля:
curl -u user:password https://example.com/wp-json/wp/v2/posts/123
Если пользователь имеет права на редактирование записи 123, в ответе будет присутствовать поле wpsnippets_private_note. Если нет — поле отсутствует или равно null.
Если попытаться обновить поле без нужных прав, API вернёт ошибку 403 Forbidden.
Использование плагинов для расширения REST API с приватными полями
Если вы предпочитаете готовые решения, обратите внимание на плагины, которые позволяют легко добавлять метаполя в REST API с настройкой доступа.
- ACF to REST API — расширяет REST API и добавляет поля Advanced Custom Fields, включая возможность настройки видимости.
- WPGraphQL — если хотите использовать GraphQL API, с помощью этого плагина и расширений можно гибко управлять приватными полями.
- Clearfy Pro — плагин для оптимизации и безопасности WordPress, который также может помочь с настройкой REST API и скрытием приватных данных.
Продвинутые советы по безопасности приватных полей в REST API
При работе с приватными данными важно учитывать ряд рекомендаций:
- Используйте проверку прав доступа на уровне
get_callbackиupdate_callback, чтобы исключить неавторизованных пользователей. - Не раскрывайте служебные данные, даже если они не используются в публичных местах сайта.
- Санитизируйте и валидируйте все входящие данные, чтобы избежать SQL-инъекций и XSS-атак.
- Логируйте ошибки и подозрительные запросы, чтобы вовремя выявлять попытки взлома.
Заключение
Добавление приватных полей в REST API WordPress — несложная задача, если придерживаться принципов безопасности и использовать правильные хуки и функции. Важно тщательно проверять права доступа и очищать данные. Такой подход позволит расширить функционал сайта и интегрировать внутренние данные с внешними сервисами без риска раскрытия конфиденциальной информации.
Если вам нужны дополнительные инструменты для работы с REST API и приватными данными, рекомендуем посмотреть решения на WPSHOP.ru.