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



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



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



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



спасибо!

715   12  

12 ответов:

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

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

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

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

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

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

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

или

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

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

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

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

предложения по поводу 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'
);

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

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

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

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

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

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

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

с помощью параметров.PHP не работал и я не видел никаких проблем в результате его использования.

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

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

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

// 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>

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

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

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

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 и последний переопределяет два перед тем, чтобы два Перед не появляются.

Comments

    Ничего не найдено.