2010-10-11 166 views
47

我正在构建一个WordPress插件,我希望有一个无法通过子菜单访问的编辑项目页面(因为这个项目不会被指定)。如何添加WordPress管理页面而不将其添加到菜单中?

此资源(http://codex.wordpress.org/Adding_Administration_Menus)显示了如何将管理页面与函数相关联,但不显示如何将其作为菜单项添加。

可以这样做吗?

谢谢!

回答

12

是的,这可以做到(好吧,从技术上讲,它更像是注册整件事,然后再删除菜单项),但它只是最简单的(我认为)检查$_GET中的参数超全球性的以表明用户希望编辑特定项目。例如,您可以有一个列出要编辑项目的页面,然后单击“编辑”仅将该项目的ID添加到当前URL(查询字符串)。

在显示此页面的功能中,如果定义了ID,请为它们提供页面以编辑该项目。

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

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

你会如何链接到另一个管理页面? – 2011-07-07 15:28:10

+2

很有帮助,但是你可能不应该直接编辑$ _registered_pa​​ges,这不是面向未来的 – dwenaus 2012-05-21 23:09:39

60
这里

最好的解决方案http://wordpress.org/support/topic/add-backend-page-without-menu-item 使用add_submenu_page与父母塞= NULL

+1

这个解决方案的一个问题是,在查看此管理页面时,无法突出显示父菜单项。这是因为'get_admin_page_parent()'总是覆盖''parent_file'全局,原始的父母'null'。这发生在'parent_file'过滤器应用之后。 – ragulka 2014-12-04 20:41:53

+3

另一个问题是,如果我们将parent slug设置为null,'get_admin_page_title()'将返回空字符串。我建议将它设置为我们知道我们将来不会使用的任何内容,如一些散列。这并不是完美的概念,但它确实符合我们的要求 - 没有项目被添加到菜单中,我们仍然可以使用'get_admin_page_title()'。 – 2015-05-26 15:04:51

+0

@ragulka使用javascript从所有#adminmenu儿童li中删除类wp-has-current-submenu,并将其添加到父项的li中。 – wesamly 2015-08-22 13:42:55

9

add_submenu_page与父母塞= NULL

OR

add_submenu_page与菜单标题= NULL

+1

验证你的方法。正常工作:add_submenu_page(NULL,'页面标题','页面标题','add_user','slug/to/new/page'); – 2013-03-29 16:58:36

+2

如果'menu_title'为'null',它将没有文本,但由于填充,您仍然可以点击它。 – 2015-02-23 14:09:59

4

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

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

根据$_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')' – Philipp 2016-03-04 22:16:18

+0

你只需要将'_doesnt_exist''设为一个空值,这样WordPress就不会告诉在哪个菜单中附加链接..谢谢! – 2016-05-24 02:24:52

+0

4.9 WP - 获取“您无权查看”错误:S – ThisGuyHasTwoThumbs 2018-01-23 11:19:22

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'); – MadMaardigan 2015-01-23 09:41:37

0

一个我发现仅仅将null作为一个子菜单项父塞的问题是,如果你是目前查看子菜单本身不会显示的特定页面(至少它不适用于我(连同页面标题未显示)。

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

-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位,因此这两个之前没有出现前的最后一个覆盖两个。

1

我已经在这里尝试了所有的建议,但与每个相关的各种问题。

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

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

+1

查看此页面时仍然无法突出显示父菜单项。 – 2017-06-12 12:08:12

1

将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不注销的回调函数;它只是删除了链接。

通过这种方式,当有人正在查看您的非链接页面时,正确的导航菜单(本例中为我们的自定义帖子类型菜单)仍然会显示为活动状态。

1

我终于发现了一个办法做到这一点,是不是一个丑陋的黑客攻击,不需要JS突出显示所需的菜单项(和子菜单项),以及适用于通过插件(@Josh's 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

完美。 – dewd 2018-01-22 02:04:58