register_meta()
Регистрирует метаполе (ключ произвольного поля).
Регистрация метаполя, нужна для использования его в разных 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
Примеры
#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] => ) ) ) */
#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, носят только информационный характер и пока нигде не используются...
#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. |