register_meta()

Позволяет использовать метаданные с определённым ключом в 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',
				),
			),
		),
	)
);

Тут прикол может быть во вложенности – ведь массив также может состоять и из объектов.

Источник: Блог Миши Рудрастых

Миша Рудрастых

Путешествует по миру и рассказывает всем о WordPress лично, у себя в блогах и на курсах в Санкт-Петербурге. Умеет просто объяснять сложные вещи, делает это красиво. Организовывает неплохие WordCamp's, но совсем не умеет слушать чужие доклады.

Добавить комментарий

%d такие блоггеры, как: