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 .
За замовчуванням: ”Тип (рядок)
Тип даних значення метаполя . Назва типу потрібно вказувати без скорочення:string
boolean
integer
number
array
(WP 5.3)object
(WP 5.3)
За замовчуванням: ‘string’
description (рядок)
Опис даних розміщених у метаполі. Щоб можна було прочитати і зрозуміти, що тут зберігається…
За замовчуванням: ”single (логічний)
true – може бути лише одне метаполе з такою назвою.
false – таких метаполів може бути декілька.
Типово: falsedefault (рядок) (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 для підтримки array of data для підключення до registered meta keys . Подібні argumenty для $sanitize_callback і $auth_callback повинні бути сформовані в цю array. |
З версії 4.9.8 | $object_subtype argument був приєднаний до arguments array. |
З версії 5.3.0 | Значні типи meta expanded включають “array” і “object”. |
З версії 5.5.0 | $default argument був added до arguments array. |