Позволяет использовать метаданные с определённым ключом в WordPress REST API. Другими словами, если у вас есть произвольное поле color
со значениями например #fff
и #000
, то вы не сможете использовать его ни при написании запросов к REST API ни в редакторе Gutenberg, например не сможете добавить поле в сайдбары.
register_meta( $object_type, $meta_key, $args, $deprecated );
Параметры
- $object_typeстрокаобязательный
- Тип сущности, для которой используются метаданные. Типы сущностей например могут быть
post
,comment
,term
,user
. - $meta_keyстрокаобязательный
- Ключ.
- $argsмассивобязательный
- Набор дополнительных параметров.
- object_subtypeстрока
- Например название типа записи при использовании типа сущности
post
в первом параметре. - descriptionстрока
- Описание.
- typeстрока
- Тип данных, хранящихся в этом мета-ключе. Довольно важный параметр, потому что при указании неправильного типа, скорее всего ничего работать не будет. Подробнее об этом в третьем примере.
- singleлогическое
- Может ли под данным ключом храниться несколько значений в базе данных.
- defaultразное
- Значение по умолчанию.
- sanitize_callbackфункция
- Функция или метод, используемая для очистки значений.
- auth_callbackфункция
- Функция или метод для проверки прав пользователей. Смотрите второй пример практического использования этого параметра.
- show_in_restлогическое|массив
- Установите в значение
true
для возможности доступа к этому параметру через REST API. Либо опишите структуру типа данных для массивов или объектов.
- $deprecatedстрока|массив
- Параметр оставлен для обратной совместимости.
Примеры
1. Регистрация мета-поля для типа записи
Зарегистриуем какое-то обычное мета-поле, например color
, которое я упоминал в самом начале для типа записи product
.
add_action( 'init', function() { register_meta( 'post', 'color', array( 'object_subtype' => 'product', 'show_in_rest' => true, ) ); } );
Тут пожалуй имеет смысл упомянуть, что параметр object_subtype
появился в версии WordPress 4.9.8 (мало ли, вдруг вы используете более раннюю версию движка).
2. Регистрация невидимых произвольных полей
Для невидимых (или защищённых) произвольных полей, тех, которые начинаются со знака нижнего подчёркивания _
, ситуация немного отличается, потому что нельзя взять и зарегистрировать его функцией register_meta()
. Ну то есть можно, но для этого нужно передать в неё ещё один параметр.
Окей, давайте предположим, что мета-ключ нашего поля из предыдущего примера не color
, а _color
, тогда код изменится следующим образом:
add_action( 'init', function() { register_meta( 'post', '_color', array( 'object_subtype' => 'product', 'show_in_rest' => true, 'auth_callback' => '__return_true', ) ); } );
То есть мы передаём колбэк-функцию, всегда возвращающую true
, в параметр auth_callback
.
3. Типы данных полей
С типами данных значений мета-полей ситуация вообще интересная – использовали или указали неверный тип? Всё, до свидания.
Когда мы используем типы данных string
или boolean
, то вроде трудностей быть не должно. Интереснее становится с типами данных array
и object
. Однако поддержка этих типов появилась в версии WordPress 5.3, до этого приходилось колдовать с JSON. Сейчас же достаточно указать структуру данных JSON в параметре show_in_rest
вместо обычного значения true
.
Итак, предположим, что в качестве значения мета-поля у нас лежит объект { "genre" : "abstraction", "artist" : "Misha" }
, тогда регистрация этого мета-поля будет выглядить вот так:
register_meta( 'post', 'art_information', array( 'single' => true, 'type' => 'object', 'show_in_rest' => array( 'schema' => array( 'type' => 'object', 'properties' => array( 'genre' => array( 'type' => 'string', ), 'artist' => array( 'type' => 'string', ), ), ), ), ) );
А что, если у нас у объекта есть ещё какое-то неизвестное свойство? Допустим мы только знаем его тип, который предположим… число! { "genre" : "abstraction", "artist" : "Misha", "dsadashdka" : 5.2 }
register_meta( 'post', 'art_information', array( 'single' => true, 'type' => 'object', 'show_in_rest' => array( 'schema' => array( 'type' => 'object', 'properties' => array( 'genre' => array( 'type' => 'string', ), 'artist' => array( 'type' => 'string', ), ), 'additionalProperties' => array( 'type' => 'number', ), ), ), ) );
А что, если мы не знаем ни свойства ни его типа данных? Тогда можно в параметр additionalProperties
передать значение true
, но так лучше не делать всё же.
Поговорим теперь за массивы. Начнём с изи – [ "Finland", "Norway", "Germany" ]
.
register_meta( 'post', 'countries', array( 'single' => true, 'type' => 'array', 'show_in_rest' => array( 'schema' => array( 'type' => 'array', 'items' => array( 'type' => 'string', ), ), ), ) );
Тут прикол может быть во вложенности – ведь массив также может состоять и из объектов.
Источник: Блог Миши Рудрастых