add_meta_box()
Додає додаткові блоки на сторінки редагування/створення постів, постійних сторінок або довільних типів записів в адмін-панелі.
Потрібно викликати на хуку add_meta_boxes .
Використовуйте wp_add_dashboard_widget() , щоб додати метабокс на сторінці адмін-панелі «Консоль», «Консоль мультисайту».
Усі зареєстровані дані перебувають у глобальному масиві $wp_meta_boxes
, що містить багатовимірний масив всіх зареєстрованих метабоксів. Містить їх ID, параметри (args), функції зворотного виклику (callback) та заголовки всіх типів записів, включаючи довільні.
Гутенберг
Відключення редактора Gutenberg через метабокс
Якщо метабокс не працює з Гутенберг, і оновити його для роботи з ним неможливо, через метабокс можна відключити Gutenberg редактор.
Для цього потрібно передати аргумент __block_editor_compatible_meta_box = false
у параметр $callback_args (параметри, що передаються колбек функції). Після цього WordPress повернеться до класичного редактора зі звичним метабоксом:
add_meta_box( 'my-meta-box', 'My Meta Box', 'my_meta_box_callback', null, 'normal', 'high', array( '__block_editor_compatible_meta_box' => false, ) );
Підтримка Gutenberg редактора
Коли метабокс повністю підтримує редактор блоків Gutenberg, можна вимкнути висновок класичного блоку метаполів, додавши аргумент __back_compat_meta_box = false
. Тепер, коли використовується гутенберг, цей метабокс більше не відображатиметься в області метабоксів, оскільки він існує тільки для зворотної сумісності. Але він як і раніше відображатиметься у Класичному редакторі, якщо гутенберг вимкнено.
add_meta_box( 'my-meta-box', 'My Meta Box', 'my_meta_box_callback', null, 'normal', 'high', array( '__back_compat_meta_box' => false, ) );
wp_nav_menu_taxonomy_meta_boxes() ,
wp_nav_menu_post_type_meta_boxes() ,
wp_add_dashboard_widget()
Хуків немає.
Повертає
null
. Нічого не вертає.
Використання
add_meta_box( $id, $title, $callback, $screen, $context, $priority, $callback_args );
-
$id
(рядок) (обов’язковий) - id атрибут HTML тега, контейнер блоку.
-
$title
(рядок) (обов’язковий) - Заголовок/назва блоку. Видно користувачам.
-
$callback
(рядок) (обов’язковий) Функція, яка виводить на екран HTML вміст блоку. Повинна виводити результат на екран.
Отримує об’єкт посту як перший параметр.
-
$screen
(рядок/масив/WP_Screen) Назва екрану, до якого додається блок. Дивіться get_current_screen() . Наприклад може бути:
- Для типів записів:
post
,page
,link
,attachment
абоcustom_post_type
- Або для інших сторінок адмінки:
link
,comment
. - Можна зазначити кілька типів у масиві:
array('post', 'page')
. З версії 4.4.
Типово: null (поточний екран)
- Для типів записів:
-
$context
(рядок) Місце, де повинен показуватися блок:
normal
,advanced
абоside
.Також, можна вказати довільне значення, у цьому випадку виведення метабоксу (обробку контексту) доведеться вішати на відповідний хук. Дивіться приклад 6 .
Типово: ‘advanced’-
$priority
(рядок) -
Пріоритет блоку для показу вище або нижче від інших блоків:
high
або
low
. Можна також вказати
core
,
default
.
За замовчуванням: ‘default’ -
$callback_args
(масив) Аргументи, які потрібно передати в callback функцію, вказану в параметрі $callback . callback функція отримає дані поста (об’єкт $post) і аргументи, передані в цьому параметрі.
Типово: null
Приклади
Ще приклади дивіться у питаннях .
#1 Метабокс для постів та сторінок
Приклад додавання довільного блоку на сторінки редагування/створення постів та постійних сторінок:
## Додаємо блоки в основну колонку на сторінках постів та пост. сторінок add_action('add_meta_boxes', 'myplugin_add_custom_box'); function myplugin_add_custom_box(){ $screens = array( 'post', 'page' ); add_meta_box( 'myplugin_sectionid', 'Назва мета блоку', 'myplugin_meta_box_callback', $screens ); } // HTML код блоку function myplugin_meta_box_callback( $post, $meta ){ $screens = $meta['args']; // Використовуємо nonce для верифікації wp_nonce_field( plugin_basename(__FILE__), 'myplugin_noncename' ); // значення поля $value = get_post_meta( $post->ID, 'my_meta_key', 1); // Поля форми для введення даних echo '<label for="myplugin_new_field">' . __("Description for this field", 'myplugin_textdomain' ) . '</label>'; echo '<input type="text" id="myplugin_new_field" name="myplugin_new_field" value="'. $value .'" size="25" />'; } ## Зберігаємо дані, коли пост зберігається add_action( 'save_post', 'myplugin_save_postdata'); function myplugin_save_postdata( $post_id ) { // Переконаємося, що поле встановлено. if ( ! isset( $_POST['myplugin_new_field'] ) ) return; // перевіряємо nonce нашої сторінки, тому що save_post може бути викликано з іншого місця. if ( ! wp_verify_nonce( $_POST['myplugin_noncename'], plugin_basename(__FILE__) ) ) return; // якщо це автозбереження нічого не робимо if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) return; // перевіряємо права користувача if( ! current_user_can( 'edit_post', $post_id ) ) return; // Все ОК. Тепер, потрібно знайти та зберегти дані // Очищаємо значення поля input. $my_data = sanitize_text_field( $_POST['myplugin_new_field'] ); // Оновлюємо дані у базі даних. update_post_meta($post_id, 'my_meta_key', $my_data); }
#2 Нова вкладка акордеону (метабокс у меню акордеону)
Цей приклад показує, як додати додатковий елемент акордеону на сторінці параметрів меню WordPress.
<?php add_action( 'admin_head-nav-menus.php', 'register_my_meta_box_accordion_nav_menus' ); function register_my_meta_box_accordion_nav_menus() { add_meta_box( 'my-custom-meta-box', 'Мій метабокс', 'render_my_meta_box_accordion_nav_menus', 'nav-menus', 'side' ); } function render_my_meta_box_accordion_nav_menus() { ?> <div class="my-custom-meta-box" id="my-custom-meta-box"> Контент метабоксу </div> <?php }
Отримаємо:
#3 Вкладка акордеону з контентом (робочий код)
Готовий код, який додає новий елемент у меню навігації (в акордіон) та заповнює його, даючи можливість вибрати елемент медіабібліотці (файл, картинку) та додати його до меню:
Отримаємо:
Основу взято з файлу custom-menu-panel.php , знайденого на просторах github і реалізує додавання кастомних об’єктів для списку.
#4 Клас PHP
Цей приклад показує, як додати додатковий блок у стилі ООП:
#5 Використання параметра $callback_args
У першому параметрі передаються інші дані запису (масив $_POST ).
У другому масив аргументів $ callback_args .
// Ця функція додає Блок, який передає дод. параметри `callback` функції my_metabox_callback() function add_my_meta_box() { $ var1 = "this"; $ var2 = "that"; $callback_args = array( 'foo'=>$var1,'bar'=>$var2 ); add_meta_box( 'metabox_id', 'Metabox Title', 'my_metabox_callback', 'page', 'normal', 'low', $callback_args ); } // $post - це об'єкт, що містить дані глобального масиву $_POST // $metabox - це масив із агрументами: metabox_id, title, callback // та новими переданими аргументами у параметрі $callback_args function my_metabox_callback( $post, $metabox ){ echo 'Last Modified:'. $post->post_modified; // час останньої зміни посту echo $metabox['args']['foo']; // раз echo $metabox['args']['bar']; // два echo get_post_meta($post->ID, 'my_custom_field', true); // значення довільно поля }
#6 Використання анонімної функції
Як колбек функції параметра $callback_args можна передавати анонімну функцію, наприклад:
add_action( 'add_meta_boxes', 'add_custom_meatbox'); function add_custom_meatbox(){ $screens = array( 'post', 'page' ); add_meta_box( 'wpsb', __( 'Metabox title', 'my-plugin' ), function() { _e ( 'Metabox content', 'my-plugin'); }, $ screens); }
Це трохи зручніше, якщо в метабоксі потрібно щось вивести.
#7 Виведення метабоксу у довільному місці {#custom-context}
Цей приклад показує, як вивести метабокс у довільному місці: відразу після поля для заголовка. Для цього задамо своє значення для параметра $context , а потім виведемо через хук edit_form_after_title . Всю карту хуків на сторінці редагування записів ви можете переглянути тут .
add_meta_box( 'my-meta-box', 'My Meta Box', 'my_meta_box_callback', null, 'my_custom_context', 'high'); add_action( 'edit_form_after_title', 'show_custom_meatbox'); function show_custom_meatbox( $post ) { do_meta_boxes( null, 'my_custom_context', $post); }
нотатки
- Global. Масив. $wp_meta_boxes
список змін
З версії 2.5.0 | Введено. |
З версії 4.4.0 | The $screen parameter now accepts an array of screen IDs. |