我正在构建一个WordPress插件,我希望有一个无法通过子菜单访问的编辑项目页面(因为这个项目不会被指定)。如何添加WordPress管理页面而不将其添加到菜单中?
此资源(http://codex.wordpress.org/Adding_Administration_Menus)显示了如何将管理页面与函数相关联,但不显示如何将其作为菜单项添加。
可以这样做吗?
谢谢!
我正在构建一个WordPress插件,我希望有一个无法通过子菜单访问的编辑项目页面(因为这个项目不会被指定)。如何添加WordPress管理页面而不将其添加到菜单中?
此资源(http://codex.wordpress.org/Adding_Administration_Menus)显示了如何将管理页面与函数相关联,但不显示如何将其作为菜单项添加。
可以这样做吗?
谢谢!
是的,这可以做到(好吧,从技术上讲,它更像是注册整件事,然后再删除菜单项),但它只是最简单的(我认为)检查$_GET
中的参数超全球性的以表明用户希望编辑特定项目。例如,您可以有一个列出要编辑项目的页面,然后单击“编辑”仅将该项目的ID添加到当前URL(查询字符串)。
在显示此页面的功能中,如果定义了ID,请为它们提供页面以编辑该项目。
否则,给他们的列表视图。这就是帖子,页面和其他自定义帖子类型的作用。
是的。通过子菜单甚至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');
希望这会有所帮助。
最好的解决方案http://wordpress.org/support/topic/add-backend-page-without-menu-item 使用add_submenu_page与父母塞= NULL
这个解决方案的一个问题是,在查看此管理页面时,无法突出显示父菜单项。这是因为'get_admin_page_parent()'总是覆盖''parent_file'全局,原始的父母'null'。这发生在'parent_file'过滤器应用之后。 – ragulka 2014-12-04 20:41:53
另一个问题是,如果我们将parent slug设置为null,'get_admin_page_title()'将返回空字符串。我建议将它设置为我们知道我们将来不会使用的任何内容,如一些散列。这并不是完美的概念,但它确实符合我们的要求 - 没有项目被添加到菜单中,我们仍然可以使用'get_admin_page_title()'。 – 2015-05-26 15:04:51
@ragulka使用javascript从所有#adminmenu儿童li中删除类wp-has-current-submenu,并将其添加到父项的li中。 – wesamly 2015-08-22 13:42:55
add_submenu_page与父母塞= NULL
OR
add_submenu_page与菜单标题= NULL
验证你的方法。正常工作:add_submenu_page(NULL,'页面标题','页面标题','add_user','slug/to/new/page'); – 2013-03-29 16:58:36
如果'menu_title'为'null',它将没有文本,但由于填充,您仍然可以点击它。 – 2015-02-23 14:09:59
注:此解决方案不会自动设置当前菜单和子菜单项目。如果要在查看隐藏页面时将某个特定菜单突出显示为当前,请参阅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'
);
作品!在上面的例子中,新页面的URL是:'admin_url('options.php?page = menu_slug')' – Philipp 2016-03-04 22:16:18
你只需要将'_doesnt_exist''设为一个空值,这样WordPress就不会告诉在哪个菜单中附加链接..谢谢! – 2016-05-24 02:24:52
4.9 WP - 获取“您无权查看”错误:S – ThisGuyHasTwoThumbs 2018-01-23 11:19:22
使用此代码来创建新的页面,而在菜单中添加
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";
}
应该是remove_menu_page('custompage'); – MadMaardigan 2015-01-23 09:41:37
一个我发现仅仅将null作为一个子菜单项父塞的问题是,如果你是目前查看子菜单本身不会显示的特定页面(至少它不适用于我(连同页面标题未显示)。
我所做的是在菜单标题中添加一个空span元素并使用jquery遍历父元素并隐藏它。
我发现你可以通过重用刀片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位,因此这两个之前没有出现前的最后一个覆盖两个。
我已经在这里尝试了所有的建议,但与每个相关的各种问题。
The WordPress codex for add_submenu_page现在给出了正确的答案,即使用options.php作为你的母体slu。。我尝试过使用组合名称的技巧,但这会给出权限错误,在各个位置同样使用null会导致菜单文本丢失(但仍然可点击)或浏览器标题丢失。
使用options.php工作,我没有看到任何问题,因为它的使用。
查看此页面时仍然无法突出显示父菜单项。 – 2017-06-12 12:08:12
将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不注销的回调函数;它只是删除了链接。
通过这种方式,当有人正在查看您的非链接页面时,正确的导航菜单(本例中为我们的自定义帖子类型菜单)仍然会显示为活动状态。
我终于发现了一个办法做到这一点,是不是一个丑陋的黑客攻击,不需要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');
完美。 – dewd 2018-01-22 02:04:58
你会如何链接到另一个管理页面? – 2011-07-07 15:28:10
很有帮助,但是你可能不应该直接编辑$ _registered_pages,这不是面向未来的 – dwenaus 2012-05-21 23:09:39