Добавление страницы администратора без отображения в меню админки
У меня есть собственный плагин 'Charts' с собственным меню. В этом меню есть ссылки на 3 страницы плагина - 'Charts', 'Add Chart' и 'Edit Chart'. Однако я не хочу отображать ссылку на 'Edit Chart'.
Вот как я добавляю нужную страницу -
$this->pagehook = add_submenu_page('charts', __('Редактировать диаграмму'), __('Редактировать диаграмму'), 'edit_charts', 'edit-chart', array(&$this, 'on_show_page'));
Я просмотрел интернет и не могу найти способ сделать это (который работает). Можно удалить целые меню верхнего уровня (не то, что мне нужно), и вы можете удалить отдельные записи из глобальной переменной $submenu
(но это также удаляет зарегистрированные права доступа), поэтому никто не может получить доступ к странице -
global $submenu;
if(!empty($submenu['charts'])) : foreach($submenu['charts'] as $key => $page) :
if($page[0] === 'Редактировать диаграмму') :
/** Удаляет все разрешения на доступ к странице */
//unset($submenu['charts'][$key]);
/** Удаляет заголовок, но пункт меню все еще существует, поэтому выглядит странно */
$submenu['charts'][$key][0] = '';
endif;
endforeach;
endif;
Я пытался скрыть это через CSS, но не вижу способа сделать это через HTML, который генерирует WordPress -
<li><a href="admin.php?page=edit-chart" tabindex="1">Редактировать диаграмму</a></li>
Я также рассматривал jQuery, но у него схожие ограничения с CSS-методом, к тому же я отказываюсь верить, что я единственный, кто когда-либо хотел сделать это - должен быть способ, я просто не могу его найти!
Буду благодарен за любые подсказки и советы.
Спасибо.

Из документации по add_submenu_page()
видно, что вы можете скрыть ссылку на подменю из пункта верхнего уровня, к которому она принадлежит, установив параметр slug
(первый аргумент) в null
:
add_action( 'admin_menu', 'register_my_custom_submenu_page' );
function register_my_custom_submenu_page() {
add_submenu_page(
null,
'Моя пользовательская страница подменю',
'Моя пользовательская страница подменю',
'manage_options',
'my-custom-submenu-page',
'my_custom_submenu_page_callback',
);
}
Чтобы выделить нужный пункт меню (например, 'все графики' при доступе к скрытой странице 'редактировать график'), можно сделать следующее:
add_filter( 'submenu_file', function($submenu_file){
$screen = get_current_screen();
if($screen->id === 'id-of-page-to-hide'){
$submenu_file = 'id-of-page-to-higlight';
}
return $submenu_file;
});

Круто, но подсветка работает некорректно. Если я устанавливаю submenu_file
, элементы отображаются как текущие. Но меню верхнего уровня не раскрывается. А если я устанавливаю parent_file
, WordPress запускает функцию get_admin_page_parent()
после фильтров и меняет его обратно. Зачем разработчики WordPress добавили фильтр parent_file
, если в любом случае функция меняет его обратно. Можете помочь?

Также, если parent_slug
установлен как null
, page_title
не используется в заголовке.

Используйте страницу подменю в качестве родительского ярлыка. Админ-меню имеет только два уровня, поэтому воображаемый третий уровень будет скрыт.
Пример кода, протестировано:
add_action( 'admin_menu', 'wpse_73622_register_hidden_page' );
function wpse_73622_register_hidden_page()
{
add_submenu_page(
'options-writing.php',
'Скрытая!',
'Скрытая!',
'exists',
'wpse_73622',
'wpse_73622_render_hidden_page'
);
# /wp-admin/admin.php?page=wpse_73622
}
function wpse_73622_render_hidden_page()
{
echo '<p>Привет, мир</p>';
}

Вы можете использовать CSS и получить доступ к элементу через URL в теге href:
#adminmenu a[href="admin.php?page=edit-chart"] {
display: none;
}
Для родительского элемента LI нет дополнительных отступов или промежутков, поэтому вам не нужно его скрывать. Вы также по-прежнему сможете получить доступ к подменю.
