Этот хук используется для добавления дополнительных подменю и пунктов меню в структуру меню панели администратора функциями add_menu_page(), add_submenu_page() и их производными.
Этот хук нельзя вызывать на хуке admin_init, поскольку admin_init вызывается после admin_menu.
Хук выполняется после создания базовой структуры меню панели администратора.
После этого хука все данные находящиеся в глобальных переменных $menu и $submenu дополнительно обрабатываются:
Проверяется право пользователя на доступ к пункту меню (см. current_user_can()). Если доступа нет, то пункт меню будет удален из списка. Название проверяемого права находится в элементе меню под индексом 1 - $data[1].
Сортировка меню. Для того чтобы сортировка работала, нужно её включить - делается это через хук add_filter( 'custom_menu_order', '__return_true' );. Затем на хуке add_filter( 'menu_order', 'my_menu_order' ) нужно указать какой именно порядок элементов нам нужен. Пример смотрите здесь.
Добавляются CSS классы для элементов меню.
Проверка доступа к странице адмники. В конце создания меню происходит проверка доступа - см. user_can_access_admin_page(). На основе текущих данных меню, текущая страница админки проверяется на наличие доступа к ней, если доступа нет, то WP прерывает свою работу с сообщением об ошибке:
wp_die( __( 'Sorry, you are not allowed to access this page.' ), 403 );
Использование
add_action( 'admin_menu', 'wp_kama_admin_menu_action' );
/**
* Function for `admin_menu` action-hook.
*
* @param string $context Empty context.
*
* @return void
*/
function wp_kama_admin_menu_action( $context ){
// action...
}
$context(строка)
Пустая строка.
Примеры
2
#1 Структура глобальных переменных $menu и $submenu
#2 Изменение названий пунктов меню и добавление разделителей
Допустим, по каким-то причинам, мы хотим изменить дефолтные названия пунктов меню в админке. Например, нам нужно добавить разделители между некоторыми пунктами и переименовать Внешний вид в Темы, а Плагины в Плагины Сайта.
Для этого создаем файл (класс) и кладем туда следующий код:
<?php
final class Change_Admin_Menu {
public static function init(): void {
add_action( 'admin_menu', [ __CLASS__, 'change' ] );
}
public static function change() {
global $menu;
self::add_separator( 9 );
self::add_separator( 70 );
foreach( $menu as & $item ){
// переименуем 'Внешний вид' в 'Тема'
if( 'themes.php' === $item[2] ){
$item[0] = __( 'Тема', 'km' );
}
// переименуем Плагины
if( 'plugins.php' === $item[2] ){
$item[0] = __( 'Плагины Сайта', 'km' );
}
}
unset( $item );
}
/**
* Добавляет разделитель в меню админки.
* Проверяет наличие указанного индекса, если он есть увеличивает указанный индекс на 1.
* Нужно это, чтобы не затереть существующие элементы меню, если указан одинаковый индекс.
*
* @param int $position Индекс, в какое место добавлять разделитель
*
* @author kama
* @ver 1.0
*/
protected static function add_separator( int $position ): void {
global $menu;
static $index;
$index || ( $index = 1 );
foreach( $menu as $mindex => $section ){
if( $mindex >= $position ){
while( isset( $menu[ $position ] ) ){
++$position;
}
$menu[ $position ] = [
'',
'read',
"separator-my{$index}",
'',
'wp-menu-separator'
];
$index++;
break;
}
}
ksort( $menu );
}
}
Подключаем созданный файл в файле functions.php и инициализируем класс: