add_meta_box()
Добавляет дополнительные блоки (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', [ '__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', [ '__back_compat_meta_box' => false, ] );
Хуков нет.
Возвращает
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'). C версии 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 Класс PHP
Этот пример показывает, как добавить дополнительный блок в стиле ООП:
#4 Использование параметра $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 ); // значение произвольно поля
} #5 Использование анонимной функции
В качестве колбэк функции параметра $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 );
}
Это немного удобнее, если в метабоксе нужно просто что-то вывести.
#6 Вывод метабокса в произвольном месте
Этот пример показывает как вывести метабокс в произвольном месте: сразу после поля для заголовка. Для этого зададим своё значение для параметра $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 );
} #7 Вкладка аккордеона с контентом (рабочий код)
Готовый код, который добавляет новый элемент в меню навигации (в аккордион) и заполняет его, давая возможность выбрать элемент медиабиблиотке (файл, картинку) и добавить его в меню:
Получим:

Основа взята из файла custom-menu-panel.php, найденного на просторах github и реализующий добавления кастомных объектов для списка.
Заметки
- Global. Массив.
$wp_meta_boxesGlobal meta box state.
Список изменений
| С версии 2.5.0 | Введена. |
| С версии 4.4.0 | The $screen parameter now accepts an array of screen IDs. |