Как добавить страницу администратора WordPress, не добавляя ее в меню? - PullRequest
54 голосов
/ 11 октября 2010

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

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

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

Спасибо!

Ответы [ 12 ]

65 голосов
/ 06 августа 2012

Лучшее решение здесь http://wordpress.org/support/topic/add-backend-page-without-menu-item

использование add_submenu_page с родительским слагом = null

19 голосов
/ 11 октября 2010

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

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

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

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

9 голосов
/ 06 октября 2012

add_submenu_page с родительским слагом = ноль

ИЛИ

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

6 голосов
/ 30 ноября 2017

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

По сути, вам просто нужно зарегистрировать ваше подменю в обычном режиме, но затем подключиться к фильтру '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' );
5 голосов
/ 08 января 2014

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

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

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

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

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";
}
4 голосов
/ 15 апреля 2011

Да. Очень возможно сделать страницу недоступной через подменю или даже главное меню в панели администратора 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 голосов
/ 14 мая 2018

Создать страницу подменю и родительский слаг оставить пустым, как это:

// Create page were you can add new users.
    public function add_create_user_menu() {
        add_submenu_page(
            '',
            'Create User',
            'Create User',
            'manage_options',
            'create-user',
            array( $this, 'add_create_user_page' )
        );
    }

Вы можете получить к нему доступ так:

<a href="/wp-admin/admin.php?page=create-user">Add New</a>
1 голос
/ 16 марта 2016

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

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

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

1 голос
/ 13 мая 2015

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...