为什么WP_Screeen没有显示ADMIN_BODY_CLASS的所有选项

时间:2021-02-03 作者:Raashid Din

我试图向管理部分添加一个特定的类。我创建了一个新的顶级菜单页面,现在我想向这个顶级菜单及其子菜单项添加一个特定的类。

到目前为止,我尝试的是WP_Screen 获取当前屏幕的数据。

如果我检查了子菜单页var_dump(get_current_screen()). 它显示了每一个细节。

但现在的情况是如果我使用get_current_screen() 具有admin_body_class 为什么它不起作用。

据我所知,钩子是在加载子菜单页面详细信息之前提前调用的。

现在我想问,如何检查子菜单是否有特定的父基,

这是我迄今为止尝试的代码。

add_filter(\'admin_body_class\', \'tw_admin_body_class\');
function tw_admin_body_class( $classes ) {
    $screen = get_current_screen();
    var_dump($screen);
    if (  $screen->parent_base == \'tw-top\' )  {
        return $classes . \' raashid\';
    }
}
但是parent_base 设置为null。如果类位于特定的顶级菜单下,您知道如何将其添加到子菜单页吗。

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

但是parent_base 设置为null。

是的,因为那时admin_body_class 被解雇,WordPress尚未设置parent_base 价值

只有在<body> 标记实际已输出。更具体地说,它只在<div id="wpbody" role="main"> 如你所见here in wp-admin/admin-header.php.

如果类位于特定的顶级菜单下,您知道如何将其添加到子菜单页吗。

您可以使用admin_body_class 钩子,但不是$screen->parent_base, 使用$screen->id 返回的钩子名称add_menu_page() 以及add_submenu_page().

要获得钩子名称,您应该或者想要使用get_plugin_page_hook().

例如:

如果我像这样添加顶级菜单和子菜单:

// Top-level menu: "Test menu"
add_menu_page( \'Test\', \'Test menu\', \'manage_options\', \'test\', \'some_function\' );

// Submenu: "Test submenu"
add_submenu_page( \'test\', \'Submenu Page\', \'Test submenu\', \'manage_options\',
    \'test-submenu\', \'some_function_2\' );

add_filter( \'admin_body_class\', \'my_admin_body_class\' );
function my_admin_body_class( $classes ) {
    $screen = get_current_screen();

    if ( get_plugin_page_hook( \'test\', \'\' ) === $screen->id ) {
        $classes .= \' foo-class\';
    }
    elseif ( get_plugin_page_hook( \'test-submenu\', \'test\' ) === $screen->id ) {
        $classes .= \' bar-class\';
    }

    return $classes; // *always return this
}
注意,我强调了return $classes; 因为在你的tw_admin_body_class() 功能$classes 仅当条件返回true时才返回。

实际上,插件页面挂钩默认添加到<body> 菜单/管理页面以及顶级菜单项的标记(<li> 标签),例如。<body class="... toplevel_page_test ..."> 在“我的”;“测试”;管理页面,所以您可以直接使用该类?