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

Nic*_*jal 57 wordpress

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

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

可以这样做吗?

谢谢!

小智 68

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

使用add_submenu_page与母体金属块=空

  • 另一个问题是,如果我们将parent slug设置为null,`get_admin_page_title()`将返回空字符串.我建议将它设置为我们知道将来不会使用的任何东西,比如哈希.这不是完美的概念,但它做了我们想要的 - 没有项目被添加到菜单,我们仍然可以使用`get_admin_page_title()`. (5认同)
  • 该解决方案的一个问题是在查看该管理页面时不可能突出显示父菜单项.这是因为`get_admin_page_parent()`总是用原始父项覆盖`$ parent_file`全局,即'null`.在应用`parent_file`过滤器后会发生这种情况. (4认同)

Joh*_*och 20

是的,这可以做到(从技术上来说,它更像是注册整个事情,然后在以后删除菜单项),但是这将是最简单的(我认为)检查$_GET超全局中的参数以指示用户希望编辑特定项目.

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

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

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


小智 9

add_submenu_page with parent slug = null

要么

add_submenu_page,菜单标题= null

  • 如果只是`menu_title`是'null`它将没有文本但你仍然可以点击它由于填充. (3认同)

J.D*_*.D. 7

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

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


Boo*_*jan 6

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

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";
}
Run Code Online (Sandbox Code Playgroud)

  • 应该是remove_menu_page('custompage'); (2认同)

J.D*_*.D. 5

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

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

基于$_GET查询var 的值以不同方式加载页面是一种选择,但它可能不是某些人正在寻找的.

有关的建议add_submenu_page()是正确的,但以前的每个建议都存在问题.设置$menu_titlenull不保持菜单项不被显示,它只是使链接没有任何文本.该链接仍占用菜单中的一些空间,因此看起来很有趣.设置$parent_slugnull没有这个问题,但我注意到页面的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'
);
Run Code Online (Sandbox Code Playgroud)