REST API в WordPress — мощный инструмент для взаимодействия с сайтом на уровне данных. Однако стандартный набор полей в ответах API далеко не всегда покрывает все потребности разработчика. Часто возникает необходимость добавить собственные поля (custom fields) в ответы API, чтобы получить более полную информацию о постах, пользователях или других сущностях.
Что такое собственные поля в WordPress и зачем их добавлять в REST API
Собственные поля (custom fields) — это дополнительные метаданные, которые можно прикреплять к записи, странице или другому типу записи. Их используют для расширения информации, которую хранит WordPress, например, цена товара, рейтинг, дата события и многое другое.
По умолчанию REST API WordPress не возвращает эти данные в ответах. Чтобы использовать их на фронтенде, мобильном приложении или внешних сервисах, нужно явно зарегистрировать и добавить отображение этих полей в API. Это позволит вам получать всю необходимую информацию одним запросом, без дополнительных обращений.
Добавление собственных полей в REST API особенно полезно при создании кастомных тем, плагинов или headless-приложений на React, Vue и других фреймворках.
Регистрация собственных полей в REST API с помощью register_rest_field
Основной способ добавить собственные поля в REST API — использовать функцию register_rest_field. Она позволяет добавить любое дополнительное поле в ответ на запросы к конкретному типу записи.
Рассмотрим пример, где у записей блога есть собственное поле wpvip_custom_rating, которое хранит рейтинг статьи от 1 до 5. Мы хотим, чтобы при запросе к API это поле возвращалось вместе с остальными данными записи.
function wpvip_register_custom_rating_field() {
register_rest_field(
'post', // тип записи
'custom_rating', // имя поля в API
array(
'get_callback' => 'wpvip_get_custom_rating',
'update_callback' => 'wpvip_update_custom_rating',
'schema' => array(
'description' => 'Рейтинг статьи от 1 до 5',
'type' => 'integer',
'context' => array('view', 'edit'),
),
)
);
}
add_action('rest_api_init', 'wpvip_register_custom_rating_field');
function wpvip_get_custom_rating($object, $field_name, $request) {
return (int) get_post_meta($object['id'], 'wpvip_custom_rating', true);
}
function wpvip_update_custom_rating($value, $object, $field_name) {
if (!is_numeric($value) || $value < 1 || $value > 5) {
return new WP_Error('rest_invalid_param', 'Рейтинг должен быть числом от 1 до 5', array('status' => 400));
}
return update_post_meta($object->ID, 'wpvip_custom_rating', (int) $value);
}В этом коде мы регистрируем новое поле custom_rating для типа записи post. В коллбэках определяем, как получить значение из мета-поля и как его обновить через PUT/PATCH-запросы к API.
Пояснения к коду
- register_rest_field — добавляет поле в ответ API.
- get_callback — функция, которая возвращает значение поля при получении данных.
- update_callback — функция, которая обрабатывает обновление значения через API.
- schema — описание поля для документации и валидации.
Таким образом, теперь в ответах REST API при запросе /wp-json/wp/v2/posts будет дополнительное поле custom_rating с рейтингом.
Добавление нескольких собственных полей и группировка данных
Если у вас несколько связанных пользовательских полей, можно объединить их в один объект. Например, если у вас есть метаданные wpvip_event_date, wpvip_event_location и wpvip_event_speaker, удобно возвращать их как объект event_details в API.
function wpvip_register_event_details_field() {
register_rest_field(
'post',
'event_details',
array(
'get_callback' => 'wpvip_get_event_details',
'schema' => array(
'description' => 'Детали события',
'type' => 'object',
'context' => array('view', 'edit'),
'properties' => array(
'date' => array('type' => 'string', 'format' => 'date-time'),
'location'=> array('type' => 'string'),
'speaker' => array('type' => 'string'),
),
),
)
);
}
add_action('rest_api_init', 'wpvip_register_event_details_field');
function wpvip_get_event_details($object) {
return array(
'date' => get_post_meta($object['id'], 'wpvip_event_date', true),
'location' => get_post_meta($object['id'], 'wpvip_event_location', true),
'speaker' => get_post_meta($object['id'], 'wpvip_event_speaker', true),
);
}Такой способ делает API-ответ более структурированным и удобным для обработки на клиенте.
Плагины для работы с метаданными и REST API
Если вы хотите упростить процесс добавления и управления собственными полями в REST API, можно использовать готовые плагины:
- Advanced Custom Fields (ACF) — позволяет создавать и управлять пользовательскими полями через удобный интерфейс. С помощью дополнительного плагина
ACF to REST APIможно автоматически добавлять поля в REST API. - WP REST API Controller — расширяет возможности управления REST API, включая настройку отображения метаданных.
- Meta Box — мощный фреймворк для создания метабоксов и полей, с поддержкой REST API.
Использование этих инструментов позволяет минимизировать количество кода и ускорить разработку.
Советы по безопасности и производительности при добавлении собственных полей в REST API
Добавляя кастомные поля в API, важно учитывать несколько моментов:
- Проверка прав доступа. Не все поля должны быть доступны всем пользователям. Используйте проверки прав (capabilities) в коллбэках, чтобы ограничить доступ к чувствительным данным.
- Валидация данных. При обновлении полей через API обязательно валидируйте входящие данные, чтобы избежать ошибок и уязвимостей.
- Кэширование. Если данные требуют сложных вычислений или обращений к базе, реализуйте кэширование результатов, чтобы сократить нагрузку.
- Минимизируйте количество полей. Возвращайте только необходимые данные, чтобы уменьшить размер ответа и ускорить загрузку.
Пример проверки прав доступа для поля рейтинга:
function wpvip_get_custom_rating($object, $field_name, $request) {
if (!current_user_can('read_post', $object['id'])) {
return null;
}
return (int) get_post_meta($object['id'], 'wpvip_custom_rating', true);
}Заключение
Добавление собственных полей в WordPress REST API расширяет возможности вашего сайта и позволяет создавать более гибкие и функциональные решения. Используя register_rest_field, вы можете легко интегрировать любые данные, а с помощью плагинов — ускорить процесс разработки. Не забывайте про безопасность и оптимизацию — это залог стабильной работы вашего приложения.