add_menu_page

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

add_menu_page() используется для создания главного пункта меню в админ-панели и прикрепления к этому пункту функции, которая будет отвечать за страницу в админ-панели связанную с этим пунктом меню.

Если нужно добавить дочерний пункт меню, используйте add_submenu_page().

Если вы видите ошибку “You do not have sufficient permissions to access this page.” при попытке зайти на страницу, это значит, что вы подключаете функцию слишком рано, подключаете функцию не на нужный хук. Нужно использовать хук admin_menu.

Хуков нет.

Возвращает

Строку. Название хука, название страницы меню или false, если пользователь не имеет прав доступа к меню.

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

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 файла относительно каталога плагинов, который отвечает за вывод кода страницы этого пункта меню.

$function(строка)

Название функции, которая выводит контент страницы пункта меню.Этот параметр необязательный и если он не указан, WordPress ожидает что текущий подключаемый PHP файл генерирует страницу код страницы админ-меню, без вызова функции. Большинство авторов плагинов предпочитают указывать этот параметр.

Два варианта установки параметра:

  1. Если функция является методом класса, она вызывается по ссылке:
    array( $this, ‘function_name’ )
    или статически:
    array( __CLASS__, ‘function_name’ ).

  2. Во всех остальных случаях указываем название функции в виде строки.
    По умолчанию: нет
$icon_url(строка)

Иконка для пункта меню.

  • Если вам нужно подключить произвольную картинку, можно использовать функцию plugin_dir_url( __FILE__ ), чтобы получить УРЛ до папки файла плагина и затем дописать к нему название картинки: plugin_dir_url( __FILE__ ) .’plugin-icon.png’. Размеры иконки должны быть 20х20 пикселей или меньше.

  • С версии 3.8, WP использует специальные иконки dashicons, чтобы указать одну из этих иконок, выберите нужную в коллекции иконок и укажите в этом параметре название иконки. Например, иконка консоли называется dashicons-dashboard указываем это название.

  • С версии 3.8. можно указывать закодированную в base64 строку, которая будет содержать картинку: data:image/svg+xml;base64…. В этом случае, иконка будет указана как фон слоя. Закодировать картинку можно в сервисе: http://duri.me/.

  • Если указать ‘none’, то будет создан слой div картинку для которого можно затем указать в CSS стилях.

  • По умолчанию, когда указана пустая строка ”, используется иконка консоли из списка dashicons и будет добавлен CSS класс menu-icon-generic в слою иконки.
    По умолчанию: ”
$position(число)

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

Внимание! Если два пункта используют одинаковую цифру-позицию, один из пунктов меню может быть перезаписан и будет показан только один пункт из двух. Чтобы избежать конфликта, можно использовать десятичные значения, вместо целых чисел: 63.3 вместо 63. Используйте кавычки для кода: “63.3”.

По умолчанию, пункт меню будет добавлен в конец списка.

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

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

}

#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 "Код страницы.";   
}

#3 Добавление пункта меню, с проверкой что его еще нет

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

global $admin_page_hooks;

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

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

Заметки

  1. Функция проверяет права пользователя, чтобы отобразить пункт меню. Функция, которая выводит код страницы должна проверять эти права отдельно.

  2. Если вы используете API настроек для сохранения данных и вам нужно чтобы сохранение работало для пользователей с правами ниже администратора, вам нужно изменить разрешение через хук option_page_capability_{$option_page}, где $option_page должно быть равно параметру $menu_slug.

Пример, как разрешить Редакторам (Editor) сохранять данные:

// Добавим видимость пункта меню для Редакторов
add_action( 'admin_menu', 'register_my_page' );
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_filter( 'option_page_capability_my_page_slug', 'my_page_capability' );

Код из


wp-admin/includes/plugin.php

WP 4.7.2

<?php
function add_menu_page( $page_title, $menu_title, $capability, $menu_slug, $function = '', $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( $function ) && !empty( $hookname ) && current_user_can( $capability ) )
		add_action( $hookname, $function );

	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 ) {
		$menu[] = $new_menu;
	} elseif ( isset( $menu[ "$position" ] ) ) {
	 	$position = $position + substr( base_convert( md5( $menu_slug . $menu_title ), 16, 10 ) , -5 ) * 0.00001;
		$menu[ "$position" ] = $new_menu;
	} else {
		$menu[ $position ] = $new_menu;
	}

	$_registered_pages[$hookname] = true;

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

	return $hookname;
}

Комментарии:


Оставить комментарий

Your email address will not be published. Required fields are marked *