Добавление страницы администратора без отображения в меню админки

22 нояб. 2012 г., 16:35:50
Просмотры: 20.9K
Голосов: 10

У меня есть собственный плагин '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-методом, к тому же я отказываюсь верить, что я единственный, кто когда-либо хотел сделать это - должен быть способ, я просто не могу его найти!

Буду благодарен за любые подсказки и советы.

Спасибо.

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

Куда вы добавляете этот хук? Какой фильтр/действие используете?

s_ha_dum s_ha_dum
22 нояб. 2012 г. 16:45:19
Все ответы на вопрос 3
3
32

Из документации по 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;
});
19 сент. 2015 г. 15:32:20
Комментарии

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

DARK_DIESEL DARK_DIESEL
28 авг. 2018 г. 16:11:17

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

DARK_DIESEL DARK_DIESEL
28 авг. 2018 г. 16:12:10

Вы можете использовать 'options.php' вместо null.

RavanH RavanH
20 мар. 2019 г. 01:58:01
1
12

Используйте страницу подменю в качестве родительского ярлыка. Админ-меню имеет только два уровня, поэтому воображаемый третий уровень будет скрыт.

Пример кода, протестировано:

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>';
}
22 нояб. 2012 г. 16:56:05
Комментарии

Это работает, однако не работает активное состояние родительского пункта меню — оно теряется, подменю закрывается, и ни один родительский пункт не выделяется в левой боковой панели.

Lee Lee
1 авг. 2016 г. 12:50:30
0

Вы можете использовать CSS и получить доступ к элементу через URL в теге href:

#adminmenu a[href="admin.php?page=edit-chart"] { 
    display: none;
}

Для родительского элемента LI нет дополнительных отступов или промежутков, поэтому вам не нужно его скрывать. Вы также по-прежнему сможете получить доступ к подменю.

31 мар. 2021 г. 16:25:50