register_rest_field()
Регистрирует новое REST поле для указанного типа REST объекта (ресурса).
Функцию нужно вызывать на событии rest_api_init. Использование этого события вместо init предотвратит регистрацию поля во время запросов к WordPress, которые не используют rest API.
Как работает функция
В REST API используется глобальная переменная $wp_rest_additional_fields. Она содержит в себе все поля ответа, которые выводятся для отдельного объекта (ресурса). REST API использует функцию register_rest_field(), как вспомогательную, чтобы добавить поле в эту глобальную переменную. Работа с этой глобальной переменной напрямую не рекомендуется, по причинам обратной совместимости.
Для каждого ресурса REST (посты, термины, комменты, юзеры и т.д.) переменная $wp_rest_additional_fields содержит массив с названиями полей и коллбек функциями для получения или обновления значений этих полей.
Хуков нет.
Возвращает
null
. Ничего (null)
Использование
register_rest_field( $object_type, $attribute, $args );
- $object_type(строка/массив) (обязательный)
Название ресурса REST для которого регистрируется поле. Несколько ресурсов можно указать в массиве.
Тут нужно указать то что в итоге получается в поле
title
из массива, который вернет метод контроллераget_item_schema()
текущего REST ресурса. Например, для пользователей нужно указатьuser
- смотрим что находится в title в коде метода WP_REST_Users_Controller::get_item_schema().Возможные значения:
- Термины:
ярлык таксономии
. Напримерcategory
,custom_taxonomy
. Для меток исключение: нужно указатьtag
, а не post_tag - см WP_REST_Terms_Controller::get_item_schema(). - Посты:
ярлык типа поста
. Например:post
,page
,custom_post_type
. - Пользователи:
user
. - Комменты:
comment
.
- Термины:
- $attribute(строка) (обязательный)
- Название поля. Это поле будет использовано как ключ в объекте REST ответа.
- $args(массив)
Параметры обработки указанного поля во время REST запроса.
-
get_callback(строка/массив/null)
PHP Функция для получения значения поля.Коллбэк функция принимает следующие параметры:
$prepared
– (array) Подготовленные данные запроса. Например данные объекта WP_Post в виде массива.$field_name
– (string) Имя поля указанное во втором параметре функции register_rest_field().$request
– (object) Все данные запроса в виде объекта WP_REST_Request.$object_type
– (string) Тип объекта для которого регистрировалось поле. Обычно это значение первого параметра функции register_rest_field().
По умолчанию: null - значение не будет показано в ответе
-
update_callback(строка/массив/null)
PHP Функция, используемая для установки и обновления значения поля.Коллбэк функция принимает следующие параметры:
$value
– Значение POST запроса для текущего поля.$post
– (object) Объект запроса -$request[ $field_name ]
. Например WP_Post.$field_name
– (string) Имя поля указанное во втором параметре функции register_rest_field().$request
– (object) Все данные запроса в виде объекта WP_REST_Request.$object_type
– (string) Тип объекта для которого регистрировалось поле. Обычно это значение первого параметра функции register_rest_field().
По умолчанию: null - значение не может быть установлено или обновлено
- schema(строка/массив/null)
Массив описывающий схему этого поля.
По умолчанию: null - схема не будет показана
По умолчанию: array()
-
Примеры
#1 Добавим поле featured_image_url в данные ответа поста
Полезно для показа основного изображения в разработке блока gutenberg, когда посты извлекаются с помощью функции withSelect().
add_action( 'rest_api_init', function () { register_rest_field( 'post', 'featured_image_url', array( 'get_callback' => function ( $post_arr ) { $image_data = wp_get_attachment_image_src( $post_arr['featured_media'], 'medium' ); return $image_data[0]; }, 'update_callback' => null, 'schema' => null ) ); } );
#2 Создаем поле выводящие имя автора поста
add_action( 'rest_api_init', function(){ register_rest_field( 'post', 'my_awesome_field', array( 'get_callback' => function( $post, $field_name, $request ){ return get_the_author_meta( 'display_name', $post['author'] ); }, 'update_callback' => null, 'schema' => [ 'description' => __( 'User public name', 'my_domain' ), 'type' => 'string' ], ) ); } );
Теперь поле my_awesome_field - можно найти в json ответе маршрута http://example.com/wp-json/wp/v2/posts.
#3 Получаем кастомные посты по произвольному полю. Или обновляем произвольное поле кастомного поста
add_action( 'rest_api_init', 'slug_register_my_post_types' ); function slug_register_my_post_types() { register_rest_field( 'my_post_type', 'my_custom_field', [ 'get_callback' => function( $object, $field_name, $request ) { return get_post_meta( $object['id'], $field_name ); }, 'update_callback' => function( $value, $object, $field_name ) { return update_post_meta( $object->ID, $field_name, strip_tags( $value ) ); }, 'schema' => [ 'type' => 'string', 'arg_options' => [ 'sanitize_callback' => function( $value ) { // Make the value safe for storage. return sanitize_text_field( $value ); }, 'validate_callback' => function( $value ) { // Valid if it contains exactly 10 English letters. return (bool) preg_match( '/\A[a-z]{10}\Z/', $value ); }, ], ], ] ); }
Таким GET запросом можно получить список постов отсортированы по значению метаполя my_custom_field:
https://myexample.com/wp-json/wp/v2/my_post_type?filter[meta_query][0][key]=my_custom_field&filter[meta_query][0][value]=my_find_value
А обновить значение этого мета поля можно POST запросом
https://myexample.com/wp-json/wp/v2/my_post_type/{id}
где {id} это id нужного поста и в параметрах запроса указано: my_custom_field => 'new_value'
.
Заметки
- Global. Массив. $wp_rest_additional_fields Holds registered fields, organized by object type.
Список изменений
С версии 4.7.0 | Введена. |
Код register_rest_field() register rest field WP 6.5.2
function register_rest_field( $object_type, $attribute, $args = array() ) { global $wp_rest_additional_fields; $defaults = array( 'get_callback' => null, 'update_callback' => null, 'schema' => null, ); $args = wp_parse_args( $args, $defaults ); $object_types = (array) $object_type; foreach ( $object_types as $object_type ) { $wp_rest_additional_fields[ $object_type ][ $attribute ] = $args; } }