Подтвердить что ты не робот

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

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

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

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

Спасибо!

4b9b3361

Ответ 1

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

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

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

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

Ответ 3

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

ИЛИ

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

Ответ 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');

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

Ответ 5

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

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

Загрузка страницы по-разному в зависимости от значения запроса $_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'
);

Ответ 6

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

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

Ответ 7

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

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

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

Ответ 8

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

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

Ответ 9

Использование 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 не отменяет регистрацию функции обратного вызова; он просто удаляет ссылку.

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

Ответ 10

Наконец-то я нашел способ сделать это, что не является уродливым взломом, не требует, чтобы 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' );

Ответ 11

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