add_meta_box() WP 2.5.0

Додає додаткові блоки на сторінки редагування/створення постів, постійних сторінок або довільних типів записів в адмін-панелі.

Потрібно викликати на хуку 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,
	)
);

Хуків немає.

Повертає

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

Приклади

Ще приклади дивіться у питаннях .

0

#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);
}
0

#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
}

Отримаємо:


0

#3 Вкладка акордеону з контентом (робочий код)

Готовий код, який додає новий елемент у меню навігації (в акордіон) та заповнює його, даючи можливість вибрати елемент медіабібліотці (файл, картинку) та додати його до меню:

<?php
/**
 * Реєстрація та додавання вкладки в акардіоні для створення меню
 *
 * @link https://gist.github.com/nikolov-tmw/8698598
 */
add_action( 'admin_head-nav-menus.php', 'register_menu_files_metabox' );
function register_menu_files_metabox() {
	add_meta_box( 'menu-media-files-metabox', 'Файли', 'render_menu_files_metabox', 'nav-menus', 'side', 'default' );
}

/**
 * Виведення на екран метабоксу "Файли"
 *
 * @param string $object Не використовується.
 * @param array $args Параметри та аргументи.
 */
function render_menu_files_metabox( $object, $args ) {
	global $nav_menu_selected_id;
	$files_ext = ['xlsx', 'pdf', 'zip'];

	$ my_items = get_posts ([
		'numberposts' => - 1,
		'post_type' => 'attachment',
		'post_mime_type' => get_mime_files_extension( $files_ext ),
	]);

	$walker = новий Walker_Nav_Menu_Checklist();
	$removed_args = [
		'action',
		'customlink-tab',
		'edit-menu-item',
		'menu-item',
		'page-tab',
		'_wpnonce',
	]; ?>
	<div id="tab-files-div">
	<div id="tabs-panel-list-files" class="tabs-panel tabs-panel-active">
		<p>Відображаються лише файли з розширенням <b><?php echo implode( ', ', $files_ext ); ?></b>.</p>

		<ul id="tab-files-checklist-pop" class="categorychecklist form-no-clear">
			<?php echo walk_nav_menu_tree( array_map( 'wp_setup_nav_menu_item', $my_items ), 0, (object) [ 'walker' => $walker ] ); ?>
		</ul>

		<p class="button-controls">
			<span class="list-controls">
				<a href="<?php
				echo esc_url(add_query_arg(
					[
						'list-files' => 'all',
						'selectall' => 1,
					],
					remove_query_arg( $removed_args )
				)));
				?>#menu-media-files-metabox" class="select-all"><?php _e( 'Select All' ); ?></a>
			</span>

			<span class="add-to-menu">
				<input type="submit"<?php wp_nav_menu_disabled_check( $nav_menu_selected_id ); ?>
					   class="button-secondary submit-add-to-menu right" value="<?php esc_attr_e( 'Add to Menu' ); ?>"
					   name="add-tab-files-menu-item" id="submit-tab-files-div"/>
				<span class="spinner"></span>
			</span>
		</p>
	</div>
	<?php
}

/**
 * Повертає mime типи розширень файлів
 *
 * @param array $files_ext розширення файлів
 *
 * @return array
 */
function get_mime_files_extension( $files_ext ) {

	// Отримує список дозволених mime типів.
	$mimes = get_allowed_mime_types();

	// Пошук mime типу у масиві розширень.
	$need_mimes = [];
	foreach ( $files_ext as $file_ext ) {
		foreach ( $mimes as $type => $mime ) {
			if ( false !== strpos( $type, $file_ext ) ) {
				$need_mimes[] = $mime;
			}
		}
	}

	return $need_mimes;
}

/**
 * Замінює посилання на сторінку медіафайлу посиланням на сам медіафайл
 *
 * @param string $link посилання на сторінку медіафайлу
 * @param string $post_id ID медіафайлу
 *
 * @return string
 */
add_filter( 'attachment_link', 'change_attachment_link', 1000, 2);
function change_attachment_link( $link, $post_id ) {
	return wp_get_attachment_url($post_id);
}

Отримаємо:

Нова вкладка акордеону з додаванням медіафайлу

Основу взято з файлу custom-menu-panel.php , знайденого на просторах github і реалізує додавання кастомних об’єктів для списку.

0

#4 Клас 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" />';
	}

}
0

#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); // значення довільно поля

}
0

#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);
}

Це трохи зручніше, якщо в метабоксі потрібно щось вивести.

0

#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.0The $screen parameter now accepts an array of screen IDs.

Код add_meta_box() WP 6.0.2

function add_meta_box( $id, $title, $callback, $screen = null, $context = 'advanced', $priority = 'default', $callback_args = null ) {
	global $wp_meta_boxes;

	if (empty($screen)) {
		$screen = get_current_screen();
	} elseif ( is_string( $screen ) ) {
		$ screen = convert_to_screen ($ screen);
	} elseif ( is_array ( $ screen ) ) {
		foreach ( $screen as $single_screen ) {
			add_meta_box( $id, $title, $callback, $single_screen, $context, $priority, $callback_args );
		}
	}

	if ( ! isset( $screen->id ) ) {
		return;
	}

	$page = $screen->id;

	if ( ! isset( $wp_meta_boxes ) ) {
		$wp_meta_boxes = array();
	}
	if ( ! isset( $wp_meta_boxes[ $page ] ) ) {
		$wp_meta_boxes[ $page ] = array();
	}
	if ( ! isset( $wp_meta_boxes[ $page ][ $context ] ) ) {
		$wp_meta_boxes[ $page ][ $context ] = array();
	}

	foreach ( array_keys( $wp_meta_boxes[ $page ] ) as $a_context ) {
		foreach ( array( 'high', 'core', 'default', 'low' ) as $a_priority ) {
			if ( ! isset( $wp_meta_boxes[ $page ][ $a_context ][ $a_priority ][ $id ] ) ) {
				continue;
			}

			// If a core box був previously removed, don't add.
			if ( ( 'core' === $priority || 'sorted' === $priority )
				&& false === $wp_meta_boxes[ $page ][ $a_context ][ $a_priority ][ $id ]
			) {
				return;
			}

			// If a core box був попередньо added by a plugin, don't add.
			if ( 'core' === $priority ) {
				/*
				 * If the box був added with default priority, give it core priority
				 * до maintain sort order.
				 */
				if ( 'default' === $a_priority ) {
					$wp_meta_boxes[ $page ][ $a_context ]['core'][ $id ] = $wp_meta_boxes[ $page ][ $a_context ]['default'][ $id ];
					unset( $wp_meta_boxes[ $page ][ $a_context ]['default'][ $id ] );
				}
				return;
			}

			// If no priority given and ID already present, use existing priority.
			if ( empty ( $ priority ) ) {
				$ priority = $ a_priority;
				/*
				 * Else, if we're adding to sorted priority, we don't know the title
				 * або callback. Grab them from the previously added context/priority.
				 */
			} elseif ( 'sorted' === $priority ) {
				$title = $wp_meta_boxes[ $page ][ $a_context ][ $a_priority ][ $id ]['title'];
				$callback = $wp_meta_boxes[ $page ][ $a_context ][ $a_priority ][ $id ]['callback'];
				$callback_args = $wp_meta_boxes[ $page ][ $a_context ][ $a_priority ][ $id ]['args'];
			}

			// An ID can be in only one priority and one context.
			if ( $priority !== $a_priority || $context !== $a_context ) {
				unset( $wp_meta_boxes[ $page ][ $a_context ][ $a_priority ][ $id ] );
			}
		}
	}

	if ( empty ( $ priority ) ) {
		$ priority = 'low';
	}

	if ( ! isset( $wp_meta_boxes[ $page ][ $context ][ $priority ] ) ) {
		$wp_meta_boxes[ $page ][ $context ][ $priority ] = array();
	}

	$wp_meta_boxes[ $page ][ $context ][ $priority ][ $id ] = array(
		'id' => $id,
		'title' => $title,
		'callback' => $callback,
		'args' => $callback_args,
	);
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *