使自定义管理子菜单项在处于活动状态时突出显示

时间:2012-03-02 作者:stvwlf

我有一个自定义的帖子类型Jobs,在Admin菜单下有3个分类法。

其中一个分类是Status,它可以是Active,也可以是Closed。我想在“作业”下为活动作业设置一个菜单项。我用这个代码创建了它

add_submenu_page(
    \'edit.php?post_type=jobs\',
    \'Active Jobs\',
    \'Active Jobs\',
    \'manage_options\',
    \'edit.php?post_type=jobs&jobstatus=67\'
);
这可以很好地工作,但当“活动作业”菜单选项处于活动状态时,“作业”菜单项将保持高亮显示。请参见屏幕截图

example of submenu display

我读了这篇文章Current class on admin menu using add_submenu_page()不将父段塞包含为第一个参数。当我删除文件名slug时,我不知道如何使子菜单显示在正确的导航部分。

此时,我没有使用回调函数,我只是执行与默认作业子菜单选项相同的URL,除了使用过滤显示的帖子的查询参数。如果将其移到回调函数中可以解决问题,我可以这样做。但我不知道回调函数应该包含什么。我想显示标准的自定义帖子类型编辑页面,只需安装分类过滤器即可。感谢您的帮助

4 个回复
SO网友:Parham

下面是我刚想到的一个不使用jQuery的解决方案:

有一个过滤器parent_file 在里面wp-admin/menu-header.php 在输出菜单之前运行。内联评论说:

用于插件移动子菜单选项卡。

它只是全局变量的过滤器$parent_file 我不确定它是做什么的,但我们将使用这个过滤器来改变全局变量$submenu_file 而是设置高亮显示的子菜单。因此,这将是您的解决方案:

add_filter(\'parent_file\', \'wpse44270_parent_file\');

function wpse44270_parent_file($parent_file){
    global $submenu_file;
    if (isset($_GET[\'jobstatus\']) && $_GET[\'jobstatus\'] == 67) $submenu_file = \'edit.php?post_type=jobs&jobstatus=67\';

    return $parent_file;
}
您可以使用任何url格式对此进行调整。例如,我使用的格式admin.php?page=my_plugin_slug&action=myaction 对于我的插件的子菜单,我用它来突出显示我的子菜单:

add_filter(\'parent_file\', \'wpse44270_1_parent_file\');

function wpse44270_1_parent_file($parent_file){
    global $submenu_file;
    if (isset($_GET[\'page\']) && isset($_GET[\'action\'])) $submenu_file = $_GET[\'page\'] . \'&action=\' . $_GET[\'action\'];

    return $parent_file;
}
PS:我也试过这个动作admin_menu 设置$submenu_file, 它在我的情况下(自定义插件页/段塞)确实有效,但不适用于edit.php 子菜单(您的案例)。因此,我搜索了另一个稍后运行的操作/筛选器,它是筛选器parent_file.

SO网友:brasofilo

我使用Posts菜单和草稿状态完成了这项工作。它依赖jQuery来修改列表项类。适应您的帖子类型和URL。

结果如下:
extra drafts submenu item

add_action( \'admin_menu\', \'wpse_44270_menu_admin\' );
add_action( \'admin_head-edit.php\', \'wpse_44270_highlight_menu_item\' );

function wpse_44270_menu_admin() 
{
    add_submenu_page(
        \'edit.php\',
        \'Drafts\', 
        \'<span id="my-draft-posts">Drafts</span>\', 
        \'edit_pages\', 
        \'edit.php?post_status=draft&post_type=post\'
    );
}

function wpse_44270_highlight_menu_item()
{
    global $current_screen;

    // Not our post type, exit earlier
    if( \'post\' != $current_screen->post_type )
        return;

    if( isset( $_GET[\'post_status\'] ) && \'draft\' == $_GET[\'post_status\'] )
    {       
        ?>
        <script type="text/javascript">
            jQuery(document).ready( function($) 
            {
                var reference = $(\'#my-draft-posts\').parent().parent();

                // add highlighting to our custom submenu
                reference.addClass(\'current\');

                //remove higlighting from the default menu
                reference.parent().find(\'li:first\').removeClass(\'current\');             
            });     
        </script>
        <?php
    }
}

SO网友:Mujnoi Gyula Tamas

我发现您还需要为链接使用html实体。既然你有

add_submenu_page(
    \'edit.php?post_type=jobs\',
    \'Active Jobs\',
    \'Active Jobs\',
    \'manage_options\',
    \'edit.php?post_type=jobs&jobstatus=67\'
);
您可以尝试将符号更改为其html实体等效项

&amp;
所以你会

add_submenu_page(
    \'edit.php?post_type=jobs\',
    \'Active Jobs\',
    \'Active Jobs\',
    \'manage_options\',
    \'edit.php?post_type=jobs&amp;jobstatus=67\'
);
这对我有用。。。我还测试了子菜单和父菜单的输出字符串,并检查它们是否匹配。这可能是一个用于检查这些内容的小实用函数

add_filter( \'parent_file\', \'test_taxonomy_highlight\' );
function test_taxonomy_highlight( $parent_file ){
   global $submenu_file;
   echo \'<pre>\', var_dump( $submenu_file, htmlentities( $submenu_file ) ), \'</pre>\';
   echo \'<pre>\', var_dump( $parent_file, htmlentities( $parent_file ) ), \'</pre>\';
   return $parent_file;
}

SO网友:rmorse

感谢所有其他的答案引导我来到这里。

线索是钩子parent_file - 然而,在上面的答案中,我看到它被用来访问全球$submenu_file 以设置激活的子菜单。

再挖一点,我发现有个钩子submenu_file - 您可以使用它来设置活动子菜单(这比覆盖全局变量更好)。

用法基本相同:

add_filter(\'submenu_file\', \'wpse44270_submenu_file\');

function wpse44270_submenu_file( $submenu_file, $parent_file ) {
    if (isset($_GET[\'jobstatus\']) && $_GET[\'jobstatus\'] == 67) {
        return \'edit.php?post_type=jobs&jobstatus=67\';
    }
    return $submenu_file;
}

结束

相关推荐

Order Admin sub-menu items?

我正在使用向CPT管理菜单添加项目add_submenu_page 这很好,但它们被添加到CPT选项后的子菜单底部。我希望能够将它们放在最上面,但我想这个问题也可以应用于订购所有基于管理员的子菜单项。我所尝试的(不起作用,我尝试了几种变体),function custom_menu_order($menu_ord) { if (!$menu_ord) return true; return array( \'edi