add_menu_page() WP 1.5.0

Додає пункт (сторінку) верхнього рівня в меню адмін-панелі (в один ряд із постами, сторінками, користувачами тощо).

Використовується для створення головного пункту меню в адмін-панелі та прикріплення до цього пункту функції, яка відповідатиме за сторінку в адмін-панелі, пов’язану з цим пунктом меню.

Потрібно викликати через один із хуків:

  • network_admin_menu — щоб додати до меню мультисайт.
  • admin_menu – звичайне адміністративне меню.

Якщо потрібно додати дочірнє меню, використовуйте add_submenu_page() .

Якщо ви бачите помилку “Ви не маєте достатніх можливостей для використання цієї сторінки.” при спробі зайти на сторінку це означає, що ви підключаєте функцію занадто рано.

Підключати функцію потрібно на хуку admin_menu .

нотатки

  1. Функція перевіряє права користувача, щоб відобразити пункт меню та відкрити доступ до сторінки цього пункту меню.

  2. Якщо ви використовуєте API налаштувань для збереження даних і потрібно, щоб збереження працювало для користувачів з правами нижче адміністратора, вам потрібно змінити дозвіл через хук option_page_capability_{$option_page}, де $option_page має дорівнювати параметру $menu_slug .

    Приклад, як дозволити Редакторам зберігати дані:

    add_action( 'admin_menu', 'register_my_page');
    add_filter( 'option_page_capability_'. 'my_page_slug', 'my_page_capability');
    
    // Додамо видимість пункту меню для редакторів
    function register_my_page(){
    	add_menu_page( 'My Page Title', 'My Page', 'edit_others_posts', 'my_page_slug', 'my_page_function', plugins_url( 'myplugin/images/icon.png' ), 6);
    }
    
    // Змінимо права
    function my_page_capability( $capability ) {
    	return 'edit_others_posts';
    }

Хуків немає.

Повертає

Строку. Назва хука, назва сторінки меню.

Використання

add_menu_page( $page_title, $menu_title, $capability, $menu_slug, $function, $icon_url, $position );
$page_title
(рядок) (обов’язковий)
Текст, який буде використаний у тезі
<title>на сторінці, що стосується пункту меню.
$menu_title
(рядок) (обов’язковий)
Назва пункту меню у сайдбарі адмін-панелі.
$capability
(рядок) (обов’язковий)
Права користувача (можливості), необхідні, щоб пункт меню з’явився у списку. Таблицю можливостей
дивіться тут .
$menu_slug
(рядок) (обов’язковий)

Унікальна назва (slug), за якою потім можна звертатися до цього меню.

Якщо параметр $function не вказаний, цей параметр повинен дорівнювати назві PHP файлу щодо каталогу плагінів, який відповідає за виведення коду сторінки цього пункту меню.

Можна вказати довільне посилання (URL), куди вестиме клік пункту меню.

$function
(рядок)

Назва функції, яка відображає контент сторінки пункту меню.

Цей необов’язковий параметр і якщо він не вказаний, WordPress очікує що поточний PHP файл генерує код сторінки адмін-меню, без виклику функції. Більшість авторів плагінів вважають за краще вказувати цей параметр.

Два варіанти встановлення параметра:

  1. Якщо функція є способом класу, вона викликається за посиланням:
    array( $this, 'function_name' )
    чи статично:
    array( __CLASS__, 'function_name' ).

  2. У решті випадків вказуємо назву функції у вигляді рядка.

За замовчуванням: ”

$icon_url
(рядок)

Значок пункту меню.

  • Картинка— щоб підключити довільне зображення, вкажіть URL-адресу зображення. І тому можна використовувати функцію: plugin_dir_url( __FILE__ ) .'plugin-icon.png'. Розміри картки мають бути 20х20 пікселів або менше.

  • dashicons— WP використовує спеціальні іконки dashicons, щоб вказати одну з цих іконок, виберіть потрібну в колекції іконок та вкажіть у цьому параметрі назву іконки. Наприклад, іконка консолі називається dashicons-dashboardвказуємо цю назву.

  • base64— можна вказувати закодований у base64 рядок, який міститиме картинку: data:image/svg+xml;base64,.... У цьому випадку, іконка буде вказана як шар фону.

    ВАЖЛИВО! З версії WP 6.0 таким чином можна вказати тільки формат SVG (png,jpg працювати не будуть).

  • none— якщо вказати 'none', то буде створено шар div картинку для якого можна вказати в CSS стилях.

  • ''— коли вказано порожній рядок (за замовчуванням), використовується іконка консолі зі списку dashicons і буде додано CSS клас menu-icon-generic.
    За замовчуванням: ”
$position
(число)

Число, що визначає позицію меню. Чим більша цифра, тим нижче буде розміщено пункт меню.

Увага! Якщо два пункти використовують однакову цифру-позицію, один із пунктів меню може бути перезаписаний і буде показано лише один пункт із двох. Щоб уникнути конфлікту, можна використовувати десяткові значення замість цілих чисел: 63.3 замість 63. Використовуйте лапки: “63.3”.

За промовчанням пункт меню буде додано до кінця списку.

Список позицій для базових пунктів меню:

2 Консоль
4 Розділювач
5 Пости
10 Медіа
15 Посилання
20 Сторінки
25 Коментарі
59 Розділювач
60 Зовнішній вигляд
65 Плагіни
70 Користувачі
75 Інструменти
80 Установки
99 Розділювач

Типово: null (наприкінці списку іконок)

Приклади

1

#1 Пункт налаштування теми

Цей приклад показує, як додати сторінку налаштувань теми в головне меню адмін-панелі WordPress.

<?php
add_action('admin_menu', function(){
	add_menu_page( 'Додаткові налаштування сайту', 'Пульт', 'manage_options', 'site-options', 'add_my_setting', '', 4);
} );

// функція відповідає за виведення сторінки налаштувань
// докладніше дивіться API Налаштувань: http://wp-kama.ru/id_3773/api-optsiy-nastroek.html
function add_my_setting(){
	?>
	<div class="wrap">
		<h2><?php echo get_admin_page_title() ?></h2>

		<?php
		// settings_errors() не спрацьовує автоматично на сторінках відмінних від опцій
		if( get_current_screen()->parent_base !== 'options-general' )
			settings_errors('назва_опції');
		?>

		<form action="options.php" method="POST">
			<?php
				settings_fields("opt_group"); // приховані захисні поля
				do_settings_sections("opt_page"); // секції з налаштуваннями (опціями).
				submit_button();
			?>
		</form>
	</div>
	<?php

}
0

#2 Додавання меню для адміністратора

Додамо пункт меню до адмін-панелі, який буде видно тільки адміністраторам:

Варіант 1 (тільки для плагінів):

add_action( 'admin_menu', 'register_my_custom_menu_page');
function register_my_custom_menu_page(){
	add_menu_page( 'custom menu title', 'custom menu', 'manage_options', 'myplugin/myplugin-admin.php', '', plugins_url( 'myplugin/images/icon.png' ), 6 );
}

У цьому випадку код сторінки повинен бути розташований у файлі wp-content/plugins/myplugin/myplugin-admin.php:

<?php
	echo "Код сторінки";
?>

Варіант 2:

add_action( 'admin_menu', 'register_my_custom_menu_page');
function register_my_custom_menu_page(){
	add_menu_page(
		'custom menu title', 'custom menu', 'manage_options', 'custompage', 'my_custom_menu_page', plugins_url( 'myplugin/images/icon.png' ), 6
	);
}

function my_custom_menu_page(){
	echo "Код сторінки";
}
0

#3 Додавання пункту меню, з перевіркою, що його ще немає

Припустимо, що перед додаванням пункту меню потрібно переконатися, що цей пункт ще не доданий з іншого місця. Для того, щоб таку перевірку зробити дуже швидкою, можна використовувати глобальну змінну $admin_page_hooks

global $admin_page_hooks;

if( isset($admin_page_hooks['ідентифікатор_пункту_меню']) ){
	add_submenu_page(...);
}
else {
	add_menu_page( ..., ..., ..., 'ідентифікатор_пункту_меню');
	add_submenu_page(...);
}
0

#4 Перевірка наявності пункту меню або пункту підменю

Ця функція перевіряє наявність пункту меню або підменю за вказаним ідентифікатором цього пункту.

/**
 * Знаходить вказаний елемент меню або підменю адмінки.
 *
 * Потрібно використовувати після події admin_menu.
 *
 * Приклад використання: if( is_admin_menu_item_exists('options-general.php') ){ }
 *
 * @param string $handle Ідентифікатор пункту меню. Вказується в 4 параметрі add_menu_page() або add_submenu_page()
 * @param boolean [$sub = false] Вказано ID меню або підменю?
 * @return boolean Є пункт меню чи ні
 */
function is_admin_menu_item_exists( $handle, $sub = false ){
	if( !is_admin() || (defined('DOING_AJAX') && DOING_AJAX) )
		return false;

	Global $menu, $submenu;

	$check_menu = $sub? $ submenu : $ menu;

	if( empty($check_menu) )
		return false;

	foreach( $check_menu as $k => $item ){
		if( $sub ){
			foreach( $item as $sm ){
			  if( $handle == $sm[2] )
				return true;
			}
		}
		elseif( $handle == $item[2] )
			return true;
	}

	return false;
}
0

#5 пункт меню з посиланням на редагування посту

Допустимо, нам потрібно додати в меню довільне посилання /wp-admin/post.php?post=270&action=edit:

add_action( 'admin_menu', 'change_menu');
function change_menu() {
	$post_id = 393;
	$url_edit = get_edit_post_link( $post_id );

	if ( $url_edit ) {
		add_menu_page( '', 'Моя стаття', 'edit_posts', $url_edit, '', '', 5 );
	}
}

нотатки

  • Global. Масив. $menu
  • Global. Масив. $admin_page_hooks
  • Global. Масив. $_registered_pages
  • Global. Масив. $_parent_pages

список змін

З версії 1.5.0Введено.

Код add_menu_page() WP 6.0.2

function add_menu_page( $page_title, $menu_title, $capability, $menu_slug, $callback = '', $icon_url = '', $position = null ) {
	Global $menu, $admin_page_hooks, $_registered_pages, $_parent_pages;

	$menu_slug = plugin_basename( $menu_slug );

	$admin_page_hooks[ $menu_slug ] = sanitize_title( $menu_title );

	$hookname = get_plugin_page_hookname( $menu_slug, '' );

	if ( ! empty( $callback ) && ! empty( $hookname ) && current_user_can( $capability ) ) {
		add_action($hookname, $callback);
	}

	if ( empty( $icon_url ) ) {
		$icon_url = 'dashicons-admin-generic';
		$icon_class = 'menu-icon-generic';
	} else {
		$ icon_url = set_url_scheme ($ icon_url);
		$icon_class = '';
	}

	$new_menu = array( $menu_title, $capability, $menu_slug, $page_title, 'menu-top' . $icon_class . $hookname, $hookname, $icon_url );

	if ( null !== $position && ! is_numeric( $position ) ) {
		_doing_it_wrong(
			__FUNCTION__,
			sprintf(
				/* translators: %s: add_menu_page() */
				__( 'The seventh parameter passed to %s should be numeric representing menu position.' ),
				'<code>add_menu_page()</code>'
			),
			'6.0.0'
		);
		$position = null;
	}

	if ( null === $position || ! is_numeric( $position ) ) {
		$menu[] = $new_menu;
	} elseif (isset ($menu [(string) $position]))) {
		$collision_avoider = base_convert( substr( md5( $menu_slug . $menu_title ), -4 ), 16, 10 ) * 0.00001;
		$position = (string) ($position + $collision_avoider);
		$menu[$position] = $new_menu;
	} else {
		/*
		 * Cast menu position to a string.
		 *
		 * Це дозволено для floats to be passed as the position. PHP will normally cast a float to an
		 * integer value, this ensures float retains її mantissa (positive fractional part).
		 *
		 * А string містить integer value, eg "10", is treated as a numeric index.
		 */
		$position = (string) $position;
		$menu[$position] = $new_menu;
	}

	$_registered_pages[ $hookname ] = true;

	// No parent as top level.
	$_parent_pages[ $menu_slug ] = false;

	return $hookname;
}

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

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