Когда вы работаете с WordPress REST API, часто возникает необходимость расширить стандартный набор данных дополнительными пользовательскими метаданными (custom fields). Стандартно WordPress не выводит такие поля в REST API, и без доработок получить их напрямую невозможно. В этой статье мы подробно разберем, как корректно зарегистрировать и отобразить пользовательские метаданные в REST API на примерах.
Почему важно добавлять пользовательские метаданные в REST API
REST API — это мощный инструмент для интеграции WordPress с внешними приложениями, фронтендами на React, Vue и прочими технологиями. Если вы создаете кастомные типы записей (custom post types) и добавляете к ним свои поля, важно, чтобы эти поля были доступны через API. Без этого фронтенд-приложения не смогут получать или сохранять нужные данные.
Отображение метаданных в REST API позволяет:
- Упростить разработку headless-приложений на WordPress;
- Обеспечить обмен данными с мобильными приложениями или внешними сервисами;
- Улучшить структурированность данных и расширить возможности кастомизации.
Регистрация пользовательских метаданных с поддержкой REST API
Для того, чтобы метаданные отображались в REST API, их необходимо зарегистрировать с параметром show_in_rest. Рассмотрим, как это сделать на примере пользовательского поля wp_tavern_rating, которое будет хранить рейтинг записи.
function wptavern_register_post_meta() {
register_post_meta('post', 'wp_tavern_rating', array(
'type' => 'number',
'single' => true,
'show_in_rest' => true,
'sanitize_callback' => 'absint',
'auth_callback' => function() {
return current_user_can('edit_posts');
}
));
}
add_action('init', 'wptavern_register_post_meta');Здесь мы регистрируем метаданные для типа записи post, указываем тип данных — number, и включаем поддержку REST API с помощью show_in_rest. Также добавлена функция для проверки прав доступа auth_callback, которая ограничивает изменение этого поля только пользователям с правами редактирования записей.
Пояснения к параметрам register_post_meta
- type — определяет тип данных, например, string, number, boolean;
- single — true, если поле хранит одно значение, false — если массив;
- show_in_rest — ключевой параметр для включения поля в REST API;
- sanitize_callback — функция для очистки данных перед сохранением;
- auth_callback — проверка прав доступа для чтения/записи.
Добавление пользовательских метаданных в кастомные типы записей
Если вы используете кастомный тип записи, например event, регистрация метаданных будет аналогичной, только первый параметр функции register_post_meta меняется на название вашего типа записи:
function wptavern_register_event_meta() {
register_post_meta('event', 'wp_tavern_event_date', array(
'type' => 'string',
'single' => true,
'show_in_rest' => true,
'sanitize_callback' => 'sanitize_text_field',
'auth_callback' => function() {
return current_user_can('edit_events');
}
));
}
add_action('init', 'wptavern_register_event_meta');<Обратите внимание, что для кастомных типов записей нужно заранее определить права доступа, например, edit_events. Если вы используете стандартные права, то для post или page подойдут edit_posts или edit_pages.
Как получить и обновить пользовательские метаданные через REST API
После регистрации метаданных они автоматически включаются в REST API. Например, запрос GET к /wp-json/wp/v2/posts/<id> будет содержать новое поле meta со всеми метаданными, зарегистрированными с show_in_rest.
Пример ответа REST API для записи с рейтингом:
{
"id": 123,
"date": "2024-06-01T10:00:00",
"title": {"rendered": "Пример записи"},
"meta": {
"wp_tavern_rating": 5
}
}Обновить значение метаданных можно через запрос POST или PUT к тому же эндпоинту с передачей поля meta в теле запроса. Пример тела запроса для обновления рейтинга:
{
"meta": {
"wp_tavern_rating": 4
}
}Важно, чтобы пользователь, делающий запрос, имел права на редактирование записи, иначе операция будет отклонена.
Отображение пользовательских метаданных в REST API для таксономий
WordPress также позволяет регистрировать метаданные для таксономий, например, категорий или тегов. Для этого используется функция register_term_meta с аналогичными параметрами. Пример регистрации метаданных для категории:
function wptavern_register_category_meta() {
register_term_meta('category', 'wp_tavern_category_icon', array(
'type' => 'string',
'single' => true,
'show_in_rest' => true,
'sanitize_callback' => 'sanitize_text_field',
'auth_callback' => function() {
return current_user_can('manage_categories');
}
));
}
add_action('init', 'wptavern_register_category_meta');После этого поле wp_tavern_category_icon будет отображаться в REST API при запросе к категориям.
Рекомендации по безопасности и производительности
При добавлении метаданных в REST API всегда внимательно настраивайте auth_callback, чтобы предотвратить утечки данных и несанкционированные изменения. Не стоит выводить в API чувствительные данные или поля, которые не должны быть публичными.
Кроме того, избегайте массовой регистрации большого числа метаданных без необходимости, так как это может негативно повлиять на производительность REST API и увеличить размер ответов.
Использование плагинов для управления метаданными в REST API
Если вы предпочитаете не писать код вручную, можно использовать плагины, которые упрощают добавление метаданных в REST API. Например:
- Clearfy Pro — плагин для оптимизации и настройки WordPress, включая расширенное управление REST API;
- Expert Review — позволяет создавать кастомные поля и управлять ими, интегрируя с REST API;
- Advanced Custom Fields (ACF) с дополнением ACF to REST API для автоматического вывода полей.
Использование плагинов может значительно ускорить разработку, но всегда проверяйте их совместимость и влияние на производительность.
Заключение
Отображение пользовательских метаданных в WordPress REST API — необходимая практика для современных проектов, использующих headless подходы и интеграции. Правильная регистрация метаданных с show_in_rest и настройка прав доступа обеспечивают надежное и удобное расширение API. В статье приведены подробные примеры кода и рекомендации, которые помогут вам быстро внедрить эту функциональность в своих проектах на WordPress.