如何在不将其添加到菜单的情况下添加WordPress管理页面?

时间:2010-10-11 00:11:28

标签: wordpress

我正在构建一个WordPress插件,我想要一个无法通过子菜单访问的编辑项目页面(因为那时不会指定该项目)。

此资源(http://codex.wordpress.org/Adding_Administration_Menus)显示如何将管理页面与功能相关联,但不显示如何在不将其添加为菜单项的情况下关联。

可以这样做吗?

谢谢!

13 个答案:

答案 0 :(得分:63)

此处的最佳解决方案http://wordpress.org/support/topic/add-backend-page-without-menu-item

  

add_submenu_page与父级slug = null

一起使用

答案 1 :(得分:19)

是的,这可以做到(从技术上讲,它更像是注册整个事情,然后在以后删除菜单项),但是最简单的(我认为)检查{{{ 1}}超全局以指示用户希望编辑特定项目。

例如,您可以有一个页面列出要编辑的项目,单击“编辑”只会将项目的ID添加到当前URL(查询字符串)。

在显示此页面的功能中,如果定义了ID,请为其指定编辑该项目的页面。

否则,给他们列表视图。这就是帖子,页面和其他自定义帖子类型的用法。

答案 2 :(得分:9)

add_submenu_page with parent slug = null

OR

add_submenu_page,菜单标题= null

答案 3 :(得分:5)

  

注意:此解决方案不会自动设置当前菜单和子菜单项。如果要在查看隐藏页面时将特定菜单突出显示为当前菜单,请参阅my other answer

从我面前的答案中,您可以看到有很多方法可以做到这一点。但是,我认为还有另一种方式可能是最好的。

根据$_GET查询var的值加载页面是一种选择,但它可能不是某些人正在寻找的。

关于add_submenu_page()的建议是正确的,但以前的每个建议都存在问题。将$menu_title设置为null不会使菜单项无法显示,只是使链接没有任何文本。该链接仍占用菜单中的一些空间,因此看起来很有趣。将$parent_slug设置为null没有此问题,但我注意到该网页的HTML title未显示$page_title文字。

我的解决方案是将$parent_slug设置为假的菜单slug,例如'i_dont_exist'。菜单项将不会显示,并且在查看管理员屏幕时,页面标题将被正确填写。

add_submenu_page(
    '_doesnt_exist'
    ,__( 'Page title', 'textdomain' )
    ,''
    ,'manage_options'
    ,'menu_slug'
    ,'display_my_menu'
);

答案 4 :(得分:5)

我终于发现了一种方法,这不是一个丑陋的黑客,不需要JS突出显示所需的菜单项(和子菜单项),并适用于插件注册的常规菜单({{3} }仅适用于自定义帖子类型)。

基本上,您只需要正常注册子菜单,然后挂钩到'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 :(得分: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');

希望这会有所帮助。

答案 6 :(得分:4)

使用此代码创建新页面而不添加菜单

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 :(得分:1)

我已经尝试了所有这些建议,但每个建议都有各种相关问题。

The WordPress codex for add_submenu_page现在给出了正确的答案,即使用options.php作为父级slug。我尝试了使用组合名称的技巧,但是这会产生权限错误,在各个位置同样使用null会导致菜单文本丢失(但仍然可以点击)或浏览器标题丢失。

使用options.php工作,我没有看到任何问题,因为它的使用。

答案 8 :(得分:1)

使用父级为NULL的add_submenu_page肯定有效,但是如果你想保持非链接页面与特定菜单(比如自定义帖子类型菜单)相关联,你必须使用@ 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不会取消注册回调函数;它只是删除链接。

这样,当有人正在查看您的非链接页面时,正确的导航菜单(此示例中的自定义帖子类型菜单)仍将显示为有效。

答案 9 :(得分:1)

创建子菜单页面并将父slug留空,如下所示:

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

答案 10 :(得分:0)

我发现仅仅添加null作为子菜单项的父slug的一个问题是,如果您当前正在查看该特定页面,则子菜单本身不会显示(至少它没有&# 39; t对我来说(连同页面标题没有显示)。

我所做的是在菜单标题中添加一个空的span元素,并使用jquery遍历父元素并隐藏它。

答案 11 :(得分:0)

似乎这种需求在当今版本中仍然有效。 我正在使用WordPress 5.3.2,并且使用以下方法从submenu中删除了父菜单。

add_action( 'admin_menu', 'submenus' ); 

function submenus()
    {
        global $submenu;

        $parent_slug = 'parent_slug_name';

        // remove parent named menu from submenu because it is always the first one in the submenu array, so the offset is 0 and remove just 1
        array_splice( $submenu[$parent_slug], 0, 1 ); // with reindex
        // or unset( $submenu[$parent_slug][0] ); // without reindex
    }

希望它可以帮助想要实现相同目标的其他人。

编辑/添加

除子菜单外,父菜单也可以类似的方式更新。 对于父菜单,全局变量为$menu。 供参考的示例:

add_action( 'admin_menu', array( $this, 'modify_menu_title' ) );

function modify_menu_title() {
    global $menu;

    $page = 'some-page-slug';
    $new_menu_title = 'New Title Name';
    foreach( $menu as $key => $value ) {
        if( $menu[$key][2] === $page ) {
            $menu[$key][0] = $new_menu_title;
        }
    }
}

答案 12 :(得分:-1)

我发现你可以通过重复使用插入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,最后一个覆盖前两个,所以两个之前没有出现。