add_meta_box() │ WP 2.5.0

Добавляет дополнительные блоки (meta box) на страницы редактирования/создания постов, постоянных страниц или произвольных типов записей в админ-панели.

Нужно вызывать на хуке add_meta_boxes или позже.

Используйте wp_add_dashboard_widget(), чтобы добавить метабокс на странице админ-панели «Консоль», «Консоль мультисайта».

Все зарегистрированные данные находятся в глобальном массиве $wp_meta_boxes, который содержит многомерный массив всех зарегистрированных метабоксов. Содержит их ID, параметры (args), функции обратного вызова (callback) и заголовки всех типов записей, включая произвольные.

Возвращает

null. Ничего не возвращает.

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

add_meta_box( $id, $title, $callback, $screen, $context, $priority, $callback_args );

$id(строка) (обязательный)id атрибут HTML тега, контейнера блока.$title(строка) (обязательный)Заголовок/название блока. Виден пользователям.$callback(строка) (обязательный)

Функция, которая выводит на экран HTML содержание блока. Должна выводить результат на экран.

Получает объект поста в качестве первого параметра.$screen(строка/массив/WP_Screen)

Название экрана для которого добавляется блок. Смотрите get_current_screen(). Например может быть:

  • Для типов записей: postpagelinkattachment или custom_post_type
  • Или для других страниц админки: linkcomment.
  • Можно указать несколько типов в массиве: array('post', 'page'). C версии 4.4.

По умолчанию: null (текущий экран)$context(строка)

Место где должен показываться блок: normaladvanced или side.

Также, можно указать произвольное значение, в этом случае, вывод метабокса (обработку контекста) придётся вешать на подходящий хук. Смотрите пример 6.
По умолчанию: ‘advanced’$priority(строка)Приоритет блока для показа выше или ниже остальных блоков: high или low. Также можно указать coredefault.
По умолчанию: ‘default’$callback_args(массив)

Аргументы, которые нужно передать в callback функцию указанную в параметре $callback. callback функция получит данные поста (объект $post) и аргументы переданные в этом параметре.

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

Примеры

Метабокс для постов и страниц

Пример добавления произвольного блока на страницы редактирования/создания постов и постоянных страниц:

## Добавляем блоки в основную колонку на страницах постов и пост. страниц
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 );
}

Класс PHP

Этот пример показывает, как добавить дополнительный блок в стиле ООП:

/**
 * Вызываем класс на странице редактирования поста.
 */
function call_someClass() {
	new someClass();
}

if ( is_admin() ) {
	add_action( 'load-post.php', 'call_someClass' );
	add_action( 'load-post-new.php', 'call_someClass' );
}

class someClass {

	/**
	 * Устанавливаем хуки в момент инициализации класса.
	 */
	public function __construct() {
		add_action( 'add_meta_boxes', array( $this, 'add_meta_box' ) );
		add_action( 'save_post', array( $this, 'save' ) );
	}

	/**
	 * Добавляем дополнительный блок.
	 */
	public function add_meta_box( $post_type ){

			// Устанавливаем типы постов к которым будет добавлен блок
			$post_types = array('post', 'page');

			if ( in_array( $post_type, $post_types )) {
				add_meta_box(
					'some_meta_box_name',
					__( 'Some Meta Box Headline', 'myplugin_textdomain' ),
					array( $this, 'render_meta_box_content' ),
					$post_type,
					'advanced',
					'high',
				);
			}
	}

	/**
	 * Сохраняем данные при сохранении поста.
	 *
	 * @param int $post_id ID поста, который сохраняется.
	 */
	public function save( $post_id ) {

		/*
		 * Нам нужно сделать проверку, чтобы убедится что запрос пришел с нашей страницы,
		 * потому что save_post может быть вызван еще где угодно.
		 */

		// Проверяем установлен ли nonce.
		if ( ! isset( $_POST['myplugin_inner_custom_box_nonce'] ) )
			return $post_id;

		$nonce = $_POST['myplugin_inner_custom_box_nonce'];

		// Проверяем корректен ли nonce.
		if ( ! wp_verify_nonce( $nonce, 'myplugin_inner_custom_box' ) )
			return $post_id;

		// Если это автосохранение ничего не делаем.
		if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
			return $post_id;

		// Проверяем права пользователя.
		if ( 'page' == $_POST['post_type'] ) {

			if ( ! current_user_can( 'edit_page', $post_id ) )
				return $post_id;

		} else {

			if ( ! current_user_can( 'edit_post', $post_id ) )
				return $post_id;
		}

		// OK, все чисто, можно сохранять данные.

		// Очищаем поле input.
		$mydata = sanitize_text_field( $_POST['myplugin_new_field'] );

		// Обновляем данные.
		update_post_meta( $post_id, '_my_meta_value_key', $mydata );
	}

	/**
	 * Код дополнительного блока.
	 *
	 * @param WP_Post $post Объект поста.
	 */
	public function render_meta_box_content( $post ) {

		// Добавляем nonce поле, которое будем проверять при сохранении.
		wp_nonce_field( 'myplugin_inner_custom_box', 'myplugin_inner_custom_box_nonce' );

		// Получаем существующие данные из базы данных.
		$value = get_post_meta( $post->ID, '_my_meta_value_key', true );

		// Выводим поля формы, используя полученные данные.
		echo '<label for="myplugin_new_field">';
		echo __( 'Description for this field', 'myplugin_textdomain' );
		echo '</label> ';
		echo '<input type="text" id="myplugin_new_field" name="myplugin_new_field"';
		echo ' value="' . esc_attr( $value ) . '" size="25" />';
	}

}