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


9

我在管理菜单中有一个自定义帖子类型,乔布斯,下面有3个分类法。

分类法之一是状态,它是活动的或已关闭的。我想要“活动作业”下的菜单项。我用这段代码创建了它

add_submenu_page(
    'edit.php?post_type=jobs',
    'Active Jobs',
    'Active Jobs',
    'manage_options',
    'edit.php?post_type=jobs&jobstatus=67'
);

这是完美的工作方式,但是当“活动作业”菜单选项处于活动状态时,“作业”菜单项保持突出显示。查看屏幕截图

子菜单显示示例

我在本文中阅读了 使用add_submenu_page()在管理菜单上的当前类, 以不将父子节作为第一个参数。当我删除文件名段时,我不知道如何使子菜单显示在正确的导航部分中。

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


我很想知道为此提出什么解决方案,因为这似乎很难做到。“ WordPress”方法将是添加一个下拉过滤器菜单,如屏幕截图所示。
史蒂芬·哈里斯

您在网址中有一个错误'edit.php?&post_type=jobs&jobstatus=67' ……首先&不应出现在该网址之后,?..
Mark Duncan

马克-您是正确的,我已经在上面的帖子和实时网站的代码中对此进行了更改。但是,这不能解决问题。感谢您指出这一点。
stvwlf 2012年

Answers:


5

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

结果如下:
额外草稿子菜单项

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
    }
}

5

这是我刚提出的不使用jQuery的解决方案:

在输出菜单之前,有一个过滤器parent_filewp-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_menuset 的操作$submenu_file,它在我的情况下(自定义插件页面/插件)确实起作用,但在edit.php子菜单(您的情况)下却没有作用。所以我搜索了另一个稍后运行的动作/过滤器,它是过滤器parent_file


0

我发现您还需要使用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;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.