Как добавить страницу администратора WordPress, не добавляя ее в меню?

47

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

Этот ресурс (http://codex.wordpress.org/Adding_Administration_Menus) показывает, как связать страницу администратора с функцией, но не делать это, не добавляя ее в качестве элемента меню.

Можно ли это сделать?

Спасибо!

Теги:
wordpress-plugin

11 ответов

13
Лучший ответ

Да, это может быть сделано (ну, технически, это будет больше похоже на регистрацию всего этого, а затем удаление элемента меню позже), но было бы проще (я думаю) проверить параметры в $_GET супер-глобальный, чтобы указать, что пользователь хочет отредактировать определенный элемент.

Например, у вас может быть страница, в которой перечислены элементы для редактирования, и нажатие "edit" добавляет идентификатор элемента к текущему URL-адресу (строке запроса).

В функции, отображающей эту страницу, если ID определен, дайте им страницу для редактирования этого элемента.

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

60

Лучшее решение здесь http://wordpress.org/support/topic/add-backend-page-without-menu-item используйте add_submenu_page с родительским slug = null

  • 4
    Одна из проблем этого решения заключается в том, что при просмотре этой страницы администратора становится невозможным выделить родительский элемент меню. Это потому, что get_admin_page_parent() всегда переопределяет глобальный $parent_file с исходным родителем, который является null . Это происходит после parent_file фильтров parent_file .
  • 5
    Другая проблема заключается в том, что get_admin_page_title() возвращает пустую строку, если мы устанавливаем родительский слаг в значение null. Я предлагаю установить его на то, что, как мы знаем, мы не будем использовать в будущем, например, на хеш. Это не идеально как концепция, но она делает то, что мы хотим - ни один элемент не добавляется в меню, и мы все еще можем использовать get_admin_page_title() .
Показать ещё 5 комментариев
9

add_submenu_page с родительским slug = null

ИЛИ

add_submenu_page с заголовком меню = null

  • 1
    Проверено ваш метод. Работает нормально: add_submenu_page (NULL, 'Заголовок страницы', 'Заголовок страницы', 'add_user', 'slug / to / new / page');
  • 3
    Если просто menu_title имеет значение null него не будет текста, но вы все равно можете щелкнуть по нему из-за заполнения.
4

Примечание. Это решение автоматически не устанавливает текущее меню и пункт подменю. Если вы хотите выделить конкретное меню как текущее, когда просматривается скрытая страница, см. мой другой ответ.

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

Загрузка страницы по-разному в зависимости от значения запроса $_GET var является одним из параметров, но может быть, это не то, что ищут некоторые люди.

Предложения относительно add_submenu_page() находятся на правильном пути, но у каждого из предыдущих предложений есть проблемы. Установка $menu_title в null не позволяет отображать пункт меню, а просто делает так, чтобы ссылка не содержала никакого текста. Ссылка все еще занимает некоторое место в меню, хотя, поэтому выглядит смешно. Установка $parent_slug на null не имеет этой проблемы, но я заметил, что страница HTML title не отображает текст $page_title.

Мое решение состояло в том, чтобы установить $parent_slug в поддельный пул меню, например 'i_dont_exist'. Элемент меню не будет отображаться, и при просмотре экрана администратора заголовок страницы будет заполнен правильно.

add_submenu_page(
    '_doesnt_exist'
    ,__( 'Page title', 'textdomain' )
    ,''
    ,'manage_options'
    ,'menu_slug'
    ,'display_my_menu'
);
  • 0
    Работает! URL-адрес новой страницы в приведенном выше примере: admin_url( 'options.php?page=menu_slug' )
  • 0
    Вам просто нужно сделать '_doesnt_exist' пустым значением, чтобы WordPress не сообщал, в каком меню добавить ссылку. Спасибо!
Показать ещё 1 комментарий
4

Да. Очень возможно сделать страницу недоступной через подменю или даже главное меню в панели администратора WP. См. Фрагмент кода ниже.

function myplugin_render_edit_page() {
    // Code contains the UI for edit page.
}

/**
 * Manage menu items and pages.
 */
function myplugin_register_admin_page() {
    global $_registered_pages;

    $menu_slug = plugin_basename('myplugin.php');
    $hookname = get_plugin_page_hookname($menu_slug,'');
    if (!empty($hookname)) {
        add_action($hookname, 'myplugin_render_edit_page');
    }
    $_registered_pages[$hookname] = true;
}
add_action('admin_menu', 'myplugin_register_admin_page');

Надеюсь, это поможет.

  • 2
    Как бы вы сослаться на это с другой страницы администратора?
  • 2
    полезно, но вы, вероятно, не должны непосредственно редактировать $ _registered_pages, это не будущее
3

используйте этот код для создания новой страницы без добавления в меню

add_action( 'admin_menu', 'register_newpage' );

function register_newpage(){
    add_menu_page($appname, $appname, 'administrator','custompage', 'custom');
    remove_menu_page('custom');
}

function custom()
{
echo "hai";
}
  • 2
    должно быть remove_menu_page ('custompage');
1

Я пробовал все предложения здесь, но с различными проблемами, связанными с каждым.

Код WordPress для add_submenu_page теперь дает правильный ответ, который должен использовать options.php в качестве родительского пула. Я попробовал трюк с использованием созданного имени, но которое дает ошибки разрешений, одинаково использующее нуль в разных местах, либо заставляет текст меню просто отсутствовать (но все еще доступен для клика), либо для названия браузера, который отсутствует.

Использование options.php работало, и я не видел никаких проблем в результате его использования.

  • 2
    Не удается выделить родительский элемент меню при просмотре этой страницы.
0

Наконец-то я нашел способ сделать это, что не является уродливым взломом, не требует, чтобы JS выделил нужный пункт меню (и элемент подменю) и работает для регулярных меню, зарегистрированных плагинами (@Josh answer работает только для пользовательских типов сообщений).

По существу, вам просто нужно зарегистрировать свое подменю в обычном режиме, но затем подключитесь к фильтру 'submenu_file', чтобы отменить его регистрацию и, кроме того, также установить другой элемент подменю для выделения.

function so3902760_wp_admin_menu() {

    // Register the parent menu.
    add_menu_page(
        __( 'Parent title', 'textdomain' )
        , __( 'Parent', 'textdomain' )
        , 'manage_options'
        , 'my_parent_slug'
        , 'display_my_menu'
    );

    // Register the hidden submenu.
    add_submenu_page(
        'my_parent_slug' // Use the parent slug as usual.
        , __( 'Page title', 'textdomain' )
        , ''
        , 'manage_options'
        , 'my_hidden_submenu'
        , 'display_my_submenu'
    );
}
add_action( 'admin_menu', 'so3902760_wp_admin_menu' );

function so3902760_wp_admin_submenu_filter( $submenu_file ) {

    global $plugin_page;

    $hidden_submenus = array(
        'my_hidden_submenu' => true,
    );

    // Select another submenu item to highlight (optional).
    if ( $plugin_page && isset( $hidden_submenus[ $plugin_page ] ) ) {
        $submenu_file = 'submenu_to_highlight';
    }

    // Hide the submenu.
    foreach ( $hidden_submenus as $submenu => $unused ) {
        remove_submenu_page( 'my_parent_slug', $submenu );
    }

    return $submenu_file;
}
add_filter( 'submenu_file', 'so3902760_wp_admin_submenu_filter' );
  • 0
    Это единственное, что достигло результата, которого я добился после, спасибо! Я submenu_file фильтр submenu_file обратно, так что он делал только remove_submenu_page( 'x_slug', 'y_slug' );return $submenu_file;
0

Использование add_submenu_page с родителем NULL определенно работает, однако, если вы хотите сохранить не связанную страницу, связанную с определенным меню (например, пользовательское меню типа сообщения), вы должны использовать вариацию ответа @Boopathi:

function my_hidden_submenu_page(){
    //add the submenu page the usual way
    add_submenu_page('edit.php?post_type=custom-type', 'My Page Title', 'My Page Title', 'manage_options', 'my-page-slug', 'my_page_callback');
    //then remove it
    remove_submenu_page('edit.php?post_type=custom-type','my-page-slug');
}
add_action('admin_menu', 'my_hidden_submenu_page');

Похоже, что два действия отменяют друг друга, однако remove_submenu_page не отменяет регистрацию функции обратного вызова; он просто удаляет ссылку.

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

0

Я нахожу, что вы можете сделать это, повторно используя id вставки, например:

add_menu_page( 'User AS Packages', 'User AS', 'manage_options', 'myplugin/editaspackages.php', 'UserASPackages', '', 8);
add_menu_page( 'User ARP Packages', 'User ARP', 'manage_options', 'myplugin/editarppackages.php', 'UserARPPackages', '', 8);
add_menu_page( 'AS Packages', 'AS Packages', 'manage_options', 'myplugin/ars-s2.php', 'ARPPackages', '', 8);

Последние 3, использующие позицию 8, и последний, переопределяют два перед тем, чтобы два перед ними не отображались.

0

Одна из проблем, которые я обнаружил, просто добавляя null в качестве родительского пула для элемента подменю, заключается в том, что если вы просматриваете эту конкретную страницу в настоящее время, то подменю не будет отображаться (по крайней мере, это не для меня ( наряду с заголовком страницы, который не отображается).

То, что я сделал, это добавить пустой элемент span внутри заголовка меню и использовать jquery для перемещения родительских элементов и скрыть его.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню