我正在构建一个WordPress插件,我想要一个无法通过子菜单访问的编辑项目页面(因为那时不会指定该项目)。
此资源(http://codex.wordpress.org/Adding_Administration_Menus)显示如何将管理页面与功能相关联,但不显示如何在不将其添加为菜单项的情况下关联。
可以这样做吗?
谢谢!
答案 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的值加载页面是一种选择,但它可能不是某些人正在寻找的。 p>
关于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,最后一个覆盖前两个,所以两个之前没有出现。