Стандартный WP REST API предоставляет базовый набор данных для пользователей, но часто возникает необходимость расширить его дополнительными пользовательскими полями, например, номером телефона, должностью или любыми другими метаданными. В этой статье мы подробно рассмотрим, как добавить пользовательские поля в REST API для объектов пользователей WordPress, используя правильные хуки и методы. Вы узнаете, как регистрировать новые поля, как обеспечить безопасность данных и приведём практические примеры с кодом.
Почему нужно добавлять пользовательские поля в WP REST API для пользователей
WP REST API — мощный инструмент для взаимодействия с сайтом через HTTP-запросы. Но по умолчанию в ответах на запросы к пользователям возвращается ограниченный набор данных: ID, имя, nicename, URL и email (только для авторизованных). Если вам нужен дополнительный контент, например, телефон, социальные ссылки или рейтинг пользователя, нужно расширять API.
Без расширения REST API придётся создавать отдельные endpoints или использовать нестандартные методы, что усложняет поддержку и интеграцию. Добавление полей прямо в REST API — это наиболее чистый и удобный способ обеспечить доступ к дополнительной информации о пользователях.
Кроме того, расширение API позволяет создавать более функциональные front-end приложения на React, Vue или других фреймворках, а также облегчает интеграцию с внешними сервисами.
Регистрация пользовательских полей в WP REST API для пользователей
Для добавления новых полей в REST API WordPress предоставляет функцию register_rest_field(). Она позволяет добавить новые поля к любому типу данных, в том числе к пользователям.
Пример регистрации поля "phone" для пользователей:
function wptask_register_user_phone_field() {
register_rest_field('user', 'phone', [
'get_callback' => 'wptask_get_user_phone',
'update_callback' => 'wptask_update_user_phone',
'schema' => [
'description' => 'Номер телефона пользователя',
'type' => 'string',
'context' => ['view', 'edit'],
],
]);
}
add_action('rest_api_init', 'wptask_register_user_phone_field');
function wptask_get_user_phone($user) {
$user_id = $user['id'];
return get_user_meta($user_id, 'phone', true);
}
function wptask_update_user_phone($value, $user, $field_name) {
if (!current_user_can('edit_user', $user->ID)) {
return new WP_Error('rest_forbidden', 'Недостаточно прав для редактирования номера телефона', ['status' => 403]);
}
if (!is_string($value)) {
return new WP_Error('rest_invalid_param', 'Неверный формат номера телефона', ['status' => 400]);
}
return update_user_meta($user->ID, 'phone', sanitize_text_field($value));
}В этом коде мы регистрируем поле phone для объектов типа user. Для получения данных используется функция wptask_get_user_phone(), которая возвращает мета-значение из пользовательских полей. Для обновления — wptask_update_user_phone(), где дополнительно проверяются права текущего пользователя и валидность данных.
Объяснение параметров
- get_callback — функция, которая возвращает значение поля при GET-запросе.
- update_callback — функция, вызываемая при обновлении поля через POST, PUT, PATCH запросы.
- schema — описание поля для документации и валидации.
Обеспечение безопасности и прав доступа
Важно правильно настроить права доступа к дополнительным полям, особенно если они содержат личные данные. В примере выше мы проверяем current_user_can('edit_user', $user->ID) — это гарантирует, что только администратор или пользователь с правом редактирования может изменить поле.
Для публичных данных (например, публичная должность или ссылка) можно упростить проверку, разрешив доступ всем:
function wptask_get_user_public_position($user) {
return get_user_meta($user['id'], 'position', true);
}
register_rest_field('user', 'position', [
'get_callback' => 'wptask_get_user_public_position',
'update_callback' => null,
'schema' => [
'description' => 'Должность пользователя',
'type' => 'string',
'context' => ['view'],
],
]);Здесь поле доступно только для чтения и появляется в публичном контексте.
Пример использования: добавление нескольких пользовательских полей
Для комплексных задач можно добавлять сразу несколько полей, например, телефон, Telegram и должность. Рекомендуется оформить код через функции с префиксом wptask_ для удобства поддержки.
function wptask_register_custom_user_fields() {
$fields = [
'phone' => 'Номер телефона',
'telegram' => 'Telegram',
'position' => 'Должность',
];
foreach ($fields as $field_key => $field_description) {
register_rest_field('user', $field_key, [
'get_callback' => function($user) use ($field_key) {
return get_user_meta($user['id'], $field_key, true);
},
'update_callback' => function($value, $user) use ($field_key) {
if (!current_user_can('edit_user', $user->ID)) {
return new WP_Error('rest_forbidden', 'Недостаточно прав для редактирования поля ' . $field_key, ['status' => 403]);
}
if (!is_string($value)) {
return new WP_Error('rest_invalid_param', 'Неверный формат поля ' . $field_key, ['status' => 400]);
}
return update_user_meta($user->ID, $field_key, sanitize_text_field($value));
},
'schema' => [
'description' => $field_description,
'type' => 'string',
'context' => ['view', 'edit'],
],
]);
}
}
add_action('rest_api_init', 'wptask_register_custom_user_fields');Такой подход уменьшает дублирование кода и упрощает расширение.
Тестирование новых полей в WP REST API
После регистрации полей проверьте их работу через запросы к API. Например, для получения данных пользователя с ID 2 выполните GET-запрос:
GET https://ваш-сайт.ru/wp-json/wp/v2/users/2В ответе должны появиться новые поля phone, telegram и position. Для обновления используйте PATCH или POST с авторизацией:
PATCH https://ваш-сайт.ru/wp-json/wp/v2/users/2
Content-Type: application/json
Authorization: Bearer ваш_токен
{
"phone": "+7 999 123-45-67"
}<Важно: для обновления полей пользователь должен иметь соответствующие права, а запрос должен быть авторизован.
Использование плагинов для расширения REST API пользователей
Если не хочется писать код самому, можно использовать плагины. Например, Clearfy Pro позволяет управлять расширением REST API и безопасностью без программирования.
Также полезен плагин ABC Pagination для удобной работы с большими списками пользователей через REST API.
Выводы и рекомендации
Добавление пользовательских полей в WP REST API для пользователей — частая и необходимая задача при создании современных расширенных сайтов и приложений на WordPress. Используйте register_rest_field() для добавления полей, всегда проверяйте права доступа и валидируйте данные.
Для упрощения работы можно использовать плагины, но если нужна гибкость и контроль — пишите свой код с префиксом wptask_. Обязательно тестируйте API через Postman или аналогичные инструменты.