WordPress как на ладони

register_meta()WP 3.3.0

Регистрирует метаполе (ключ произвольного поля).

Регистрация метаполя, нужна для использования его в разных API, например для REST API. Или такую регу можно использовать при добавлении полей в метабокс: add_meta_box()...

Рекомендуется регистрировать мета-ключи для конкретной комбинации типа объекта и подтипа объекта. Если подтип объекта не указан, мета-ключ будет зарегистрирован для всего типа объекта, однако он может быть частично переопределен в случае, если для того же типа объекта и подтипа существует другой, аналогичный мета-ключ.

Если тип объекта не поддерживает никаких подтипов, например, пользователи или комментарии, то данную функцию следует вызывать без указания подтипа.

Поведение этой функции чем-то походе на register_post_type() - данные аналогично сохраняются в глобальную переменную $wp_meta_keys. Это позволит получать данные метаполя в любом месте движка, делая удобным расширение кода.

Регистрация в глобальную переменную доступна только с версии WP 4.6. Подразумевается, что функция и технология которую она подразумевает начнет повсеместно использоваться с версии WordPress 4.6.

  • Используйте get_registered_meta_keys(), чтобы получить данные всех зарегистрированных метаполей.

  • Используйте unregister_meta_key(), чтобы удалить ранее зарегистрированное метаполе.
Хуки из функции

Возвращает

true|false.

  • true - если мета-ключ был успешно зарегистрирован в глобальном массиве $wp_meta_keys.
  • false - если не удалось зарегистрировать ключ.

Использование

register_meta( $object_type, $meta_key, $args, $deprecated );
$object_type(строка) (обязательный)
Тип объекта для которого регистрируется метаполе: post, user, comment, term. Параметр $meta_type из функций {add/get/update/delete}_metadata( $meta_type, ...)
$meta_key(строка) (обязательный)
Название ключа, который регистрируется.
$args(массив) (обязательный)

Данные описывающие метаполе. По умолчанию такие:

$args = array(
	'object_subtype'    => '',
	'type'              => 'string',
	'description'       => '',
	'default'           => '',       // WP 5.5
	'single'            => false,
	'sanitize_callback' => null,
	'auth_callback'     => null,
	'show_in_rest'      => false,
);
  • object_subtype(строка) (с версии 4.9.8)
    Точный тип объекта для которого регистрируется метаполе. Например, если $object_type = post, то тут можно указать название типа записи для которого регистрируется метаполе. Если оставить этот параметр пустым, то метаполе будет зарегистрировано для всех $object_type.
    По умолчанию: ''

  • type(строка)
    Тип данных значения метаполя. Название типа нужно указывать без сокращения:

    • string
    • boolean
    • integer
    • number
    • array (WP 5.3)
    • object (WP 5.3)

    По умолчанию: 'string'

  • description(строка)
    Описание данных размещаемых в метаполе. Чтобы можно было прочитать и понять что тут хранится...
    По умолчанию: ''

  • single(логический)
    true - может быть только одно метаполе с таким названием.
    false - таких метаполей может быть несколько.
    По умолчанию: false

  • default(строка) (WP 5.5)
    Значение по умолчанию, возвращаемое функцией get_metadata(), если оно еще не установлено. При использовании не одного мета-ключа значение по умолчанию используется для первой записи. Другими словами, при вызове get_metadata() с $single=false, заданное здесь значение будет обернуто в массив.
    По умолчанию: ''

  • sanitize_callback(строка)
    Название функции или метода, который будет использован при очистки значения метаполя при сохранении. Указанная функция будет добавлена в фильтр: sanitize_{$object_type}_meta_{$meta_key}.

    Функция получит три параметра: $meta_value, $meta_key, $object_type. Подробнее см. код функции sanitize_meta().

    По умолчанию: null

  • auth_callback(строка)
    Функция или метод которая будет вызвана для проверки прав edit_post_meta, add_post_meta и delete_post_meta. Указанная функция будет добавлена в фильтр: auth_(object_type)_meta_(meta_key).

    Функция должна вернуть true или false, что будет означать разрешать или запрещать соответствующее действие пользователю. Если не указать функцию, то права на создание/удаление метаполя получат все юзеры обладающие правами редактировать метаполя.

    Функция получит шесть параметров:

    function my_callback( $false, $meta_key, $post_id, $user_id, $cap, $caps ){
    	// ваша проверка
    }

    Подробнее смотрите код функции map_meta_cap().

    Смотрите фильтры:

    По умолчанию: null (__return_true)

  • show_in_rest(логический)
    Нужно ли показывать эти данные в REST запросах. Являются ли данные этого метаполя публичными.
    По умолчанию: false
$deprecated(строка/массив)
Устарелый с версии 4.6 параметр. Используйте $args взамен.
По умолчанию: null

Примеры

0

#1 Демонстрация работы

Для начала давайте регнем метаполе и посмотрим что добавилось в глобальный массив:

register_meta( 'post', 'bookname', array(
	'type'              => 'string',
	'description'       => 'Название книги',
	'single'            => true,
	'sanitize_callback' => null,
	'auth_callback'     => null,
	'show_in_rest'      => false,
) );

global $wp_meta_keys;

print_r( $wp_meta_keys );

/*
Array
(
	[post] => Array
		(
			[bookname] => Array
				(
					[type] => string
					[description] => Название книги
					[single] => 1
					[sanitize_callback] =>
					[auth_callback] => __return_true
					[show_in_rest] =>
				)

		)
)
*/
0

#2 Регистрация метаполя

Теперь давайте зарегистрируем метаполе с функциями доступа и очистки и проверим как это работает:

register_meta( 'post', 'bookname', array(
	'type'              => 'string',
	'description'       => 'Название книги',
	'single'            => true,
	'sanitize_callback' => 'sanitize_bookname_meta',
	'auth_callback'     => 'auth_bookname_meta',
	'show_in_rest'      => false,
) );

function sanitize_bookname_meta( $meta_value, $meta_key, $object_type ){
	$meta_value = wp_strip_all_tags( $meta_value ); // Удалим html теги

	return $meta_value;
}

function auth_bookname_meta( $false, $meta_key, $postID, $user_id, $cap, $caps ){
	// запретим создание и редактирование этого метаполя для всех кроме админа
	if( ! current_user_can('manage_options') )
		return false;
	return true;
}

В результате, если зайти на страницу редактирования записи и попробовать там создать метаполе bookname:

  • Если вы вошли как админ - метаполе создастся.
  • Если как редактор, автор и т.д. - вы не сможете создать это метаполе.

За это отвечает параметр auth_callback

Далее, если в значении указать строку с HTML тегами, при обновлении они будут вырезаны.
За это отвечает параметр sanitize_callback

Параметры: type, description, single в версии WP 4.6, носят только информационный характер и пока нигде не используются...

0

#3 Регистрация метаполя для конкретного типа записи

С WordPress 4.9.8 эта функция поддерживает регистрацию метаданных не только для всего типа объекта (записи, термины, комментарии, пользователи), но и для конкретного подтипа (например, определенного типа записи или таксономии). Для этого указываем параметр object_subtype:

register_meta( 'post', 'my_meta_key', array(
	'object_subtype'    => 'my_post_type',
	'show_in_rest'      => true,
	'sanitize_callback' => 'absint',
) );

Теперь указанное метаполе будет считаться метаполем типа записи my_post_type и никакого другого типа.

Точно также можно регнуть метаполе для типа записи, с помощью функции register_post_meta():

register_post_meta( 'my_post_type', 'my_meta_key', array(
	'show_in_rest'      => true,
	'sanitize_callback' => 'absint',
) );

register_post_meta() - это функция-обертка и создана для более понятной и удобной регистрации метаполя.

Список изменений

С версии 3.3.0 Введена.
С версии 4.6.0 Modified to support an array of data to attach to registered meta keys. Previous arguments for $sanitize_callback and $auth_callback have been folded into this array.
С версии 4.9.8 The $object_subtype argument was added to the arguments array.
С версии 5.3.0 Valid meta types expanded to include "array" and "object".
С версии 5.5.0 The $default argument was added to the arguments array.

Код register_meta() WP 6.2.2

function register_meta( $object_type, $meta_key, $args, $deprecated = null ) {
	global $wp_meta_keys;

	if ( ! is_array( $wp_meta_keys ) ) {
		$wp_meta_keys = array();
	}

	$defaults = array(
		'object_subtype'    => '',
		'type'              => 'string',
		'description'       => '',
		'default'           => '',
		'single'            => false,
		'sanitize_callback' => null,
		'auth_callback'     => null,
		'show_in_rest'      => false,
	);

	// There used to be individual args for sanitize and auth callbacks.
	$has_old_sanitize_cb = false;
	$has_old_auth_cb     = false;

	if ( is_callable( $args ) ) {
		$args = array(
			'sanitize_callback' => $args,
		);

		$has_old_sanitize_cb = true;
	} else {
		$args = (array) $args;
	}

	if ( is_callable( $deprecated ) ) {
		$args['auth_callback'] = $deprecated;
		$has_old_auth_cb       = true;
	}

	/**
	 * Filters the registration arguments when registering meta.
	 *
	 * @since 4.6.0
	 *
	 * @param array  $args        Array of meta registration arguments.
	 * @param array  $defaults    Array of default arguments.
	 * @param string $object_type Type of object metadata is for. Accepts 'post', 'comment', 'term', 'user',
	 *                            or any other object type with an associated meta table.
	 * @param string $meta_key    Meta key.
	 */
	$args = apply_filters( 'register_meta_args', $args, $defaults, $object_type, $meta_key );
	unset( $defaults['default'] );
	$args = wp_parse_args( $args, $defaults );

	// Require an item schema when registering array meta.
	if ( false !== $args['show_in_rest'] && 'array' === $args['type'] ) {
		if ( ! is_array( $args['show_in_rest'] ) || ! isset( $args['show_in_rest']['schema']['items'] ) ) {
			_doing_it_wrong( __FUNCTION__, __( 'When registering an "array" meta type to show in the REST API, you must specify the schema for each array item in "show_in_rest.schema.items".' ), '5.3.0' );

			return false;
		}
	}

	$object_subtype = ! empty( $args['object_subtype'] ) ? $args['object_subtype'] : '';

	// If `auth_callback` is not provided, fall back to `is_protected_meta()`.
	if ( empty( $args['auth_callback'] ) ) {
		if ( is_protected_meta( $meta_key, $object_type ) ) {
			$args['auth_callback'] = '__return_false';
		} else {
			$args['auth_callback'] = '__return_true';
		}
	}

	// Back-compat: old sanitize and auth callbacks are applied to all of an object type.
	if ( is_callable( $args['sanitize_callback'] ) ) {
		if ( ! empty( $object_subtype ) ) {
			add_filter( "sanitize_{$object_type}_meta_{$meta_key}_for_{$object_subtype}", $args['sanitize_callback'], 10, 4 );
		} else {
			add_filter( "sanitize_{$object_type}_meta_{$meta_key}", $args['sanitize_callback'], 10, 3 );
		}
	}

	if ( is_callable( $args['auth_callback'] ) ) {
		if ( ! empty( $object_subtype ) ) {
			add_filter( "auth_{$object_type}_meta_{$meta_key}_for_{$object_subtype}", $args['auth_callback'], 10, 6 );
		} else {
			add_filter( "auth_{$object_type}_meta_{$meta_key}", $args['auth_callback'], 10, 6 );
		}
	}

	if ( array_key_exists( 'default', $args ) ) {
		$schema = $args;
		if ( is_array( $args['show_in_rest'] ) && isset( $args['show_in_rest']['schema'] ) ) {
			$schema = array_merge( $schema, $args['show_in_rest']['schema'] );
		}

		$check = rest_validate_value_from_schema( $args['default'], $schema );
		if ( is_wp_error( $check ) ) {
			_doing_it_wrong( __FUNCTION__, __( 'When registering a default meta value the data must match the type provided.' ), '5.5.0' );

			return false;
		}

		if ( ! has_filter( "default_{$object_type}_metadata", 'filter_default_metadata' ) ) {
			add_filter( "default_{$object_type}_metadata", 'filter_default_metadata', 10, 5 );
		}
	}

	// Global registry only contains meta keys registered with the array of arguments added in 4.6.0.
	if ( ! $has_old_auth_cb && ! $has_old_sanitize_cb ) {
		unset( $args['object_subtype'] );

		$wp_meta_keys[ $object_type ][ $object_subtype ][ $meta_key ] = $args;

		return true;
	}

	return false;
}
4 комментария
    Войти