将CPT和Tax添加到子菜单的细微差别

时间:2012-11-07 作者:ken

我有很多CPT和自定义分类,并决定将它们放在几个子菜单中。效果很好。稍后我将解释我是如何做到这一点的,但问题是,当你选择“新术语”或“新帖子”时,管理员的侧栏菜单会失去位于子菜单中的轨迹,并折叠菜单。严格来说,这并不重要,因为您可以添加该项目,然后重新打开管理菜单,但这是一个刺激,我想删除。

为了帮助解释我的问题,我提供了一些屏幕截图。当我打开“LG参考数据/计量单位”的菜单/子菜单时,这里是管理菜单:

enter image description here

到目前为止,一切都很好。顺便说一句,UOM是CPT(非税)。现在,如果我单击编辑顶部的“添加新”按钮。php页面然后会很好地显示页面,但管理菜单会折叠为如下所示:

enter image description here

这是主要的问题,但有一个小推论,它与税收的行为有关。在最初的屏幕截图中,您看到了一个名为“UOM上下文”的子菜单,它是一种分类法。默认情况下,单击该选项会立即折叠“管理”菜单,但我已经找到了一种解决方法(稍后会详细介绍),但当我单击“UOM上下文”链接时,我的解决方案仍然会使菜单保持如下所示:

enter image description here

请注意,虽然它没有折叠,但没有突出显示(又名黑体)子菜单选项。

因此,让我向您展示我用来设置此功能的代码(尽管对于尝试这样做的人来说,这可能是相当标准的代码)。从执行角度来看,第一件事是注册CPT和税务。CPT的诀窍是使用“show\\u in\\u menu”(在菜单中显示),并将其设置为它将位于的菜单页的名称:

        // Default args
        array(
            \'label\'                 => $plural,
            \'labels\'                => $labels,
            \'public\'                => true,
            \'show_ui\'               => $this->show_menu,
            \'show_in_menu\'          => $this->show_in_menu,
            \'supports\'              => array( \'title\', \'editor\' , \'excerpt\'),
            \'show_in_nav_menus\'     => true,
            \'menu_icon\'             => LG_FE_DIR . "/img/lg-admin.png",
            \'menu_position\'         => $this->get_menu_priority(),
            \'_builtin\'              => false,
        ),
请注意,这对于税务来说是不必要的,在我的实验中,它似乎没有任何效果,所以我只是暂时停止了它。第二步是add\\u menu\\u page和add\\u submenu\\u page调用:

add_menu_page ("LG Ref Data", "LG Ref Data", "manage_options", LG_REFDATA_MENU, "LG_AdminMenuSystem::show_reference_menu", plugins_url ("/img/LG.png", __DIR__), 61.1);
add_submenu_page (LG_REFDATA_MENU,"UOMs","UOMs","manage_options",\'edit.php?post_type=uoms\');
add_submenu_page (LG_REFDATA_MENU,"UOM Context","UOM Context","manage_options",\'edit-tags.php?taxonomy=uom-contexts&post_type=uoms\');
array_push (self::$tax_correct, "uom-contexts");    
非常标准的东西,除了我前面提到的最后一行,这是我的税务修复的开始(即,在选择税务项目时阻止菜单崩溃,但在添加新项目时不会阻止它)。以下是修复的实际代码:

static public function tax_menu_correction ($parent_file) {
    global $current_screen;
    $taxonomy = $current_screen->taxonomy;
    if ( in_array($taxonomy,self::$tax_correct) )
        $parent_file = LG_REFDATA_MENU;
    return $parent_file;
}
然后从以下挂钩调用:

add_action( \'parent_file\' , \'LG_AdminMenuSystem::tax_menu_correction\'); // helps to keep the menu selection on the menu when choosing a custom TAX 
就是这样。我们将不胜感激。

3 个回复
最合适的回答,由SO网友:ken 整理而成

嗯,我不知道这里发生了什么事。我可以发誓我已经回答了这个问题,并把它关闭了。无论如何,我使用了一种基于@brasofilo建议的方法。基本上,您需要做的就是:

在注册子菜单的PHP中,使用如下声明:

add_submenu_page ( LG_TRANSACTIONAL_MENU,
        $plural ,"<span id=\'submenu-{$plural}\'>" . $plural . "</span>",
        "manage_options",
        "edit.php?post_type={$this->custom_type_slug_name}"
);
在我的例子中,这个PHP驻留在我编写的自定义post类型插件中,因此变量名是特定的,但关键是您添加了一个可供jQuery选择的DOM ID。在这种情况下,ID将是子菜单-[CPT的复数名称]。

其余部分使用jQuery完成:

// If on a custom taxonomy editing page then make sure the menu item is selected
if ( adminpage === "edit-tags-php") {
    $(\'#submenu-\' + pagenow).closest(\'li\').addClass(\'current\');
}
// if on a edit post-type page (post-new.php) then make sure menu is selected, expanded, and the submenu is current
if (adminpage === "post-new-php") {
    $(\'#submenu-edit-\' + pagenow).closest(\'li\').addClass(\'current\');
    $(\'#submenu-edit-\' + pagenow).closest(\'.wp-has-submenu\').removeClass(\'wp-not-current-submenu\').addClass(\'wp-has-current-submenu\');
}

SO网友:brasofilo

我回答了一个similar Question. 好了,你必须用jQuery来解决它。

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\');
诀窍是在自定义菜单中添加ID,以便reference 他们

add_submenu_page(
    \'edit.php\',
    \'Drafts\', 
    \'<span id="my-draft-posts">Drafts</span>\', // <---- HERE
    \'edit_pages\', 
    \'edit.php?post_status=draft&post_type=post\'
);
很可能,您将需要比此示例更多的jQuery。

SO网友:webaware

我现在有一个漏洞,因为我有一个插件需要它。我还使用管理过滤器挂钩parent_file 这使您可以指定页面逻辑上所在的顶级管理菜单项。(注意:这是一个过滤器,不是一个操作;add\\u操作也可以,但它应该是add\\u filter)

我的问题是,我实际上不想在菜单中列出自定义帖子类型编辑页面,我只想从菜单中的另一个页面链接到它。这意味着我\'show_in_menu\' => false 我想这就是你说的,你现在也有了。

为了将子菜单项设置为“当前”,我必须添加一个改变全局变量的副作用$submenu_file 以匹配我拥有该链接的页面。

注意:这几乎是从一些工作代码中删除的,所以请根据您的代码进行调整。

// this filter only added when loading the edit page
add_filter(\'parent_file\', \'wpse_71865_filterParentFile\');

/**
* tell WordPress admin the parent page for the menu
* @param string $parent_file
* @return string
*/
public function wpse_71865_filterParentFile($parent_file) {
    global $submenu_file;

    // set parent menu item for filter return
    // (Gravity Forms in my case)
    $parent_file = \'gf_edit_forms\';

    // set submenu item by side effect, link isn\'t in menu
    $submenu_file = \'gfdpspxpay-options\';

    return $parent_file;
}
请注意,我正在附加到页面(即。page=gfdpspxpay-options) 所以$submenu_file 可能不适合你。如果没有,请查看wp-admin/menu-header.php 这就是这一切发生的地方。有一个数组$submenu_items 这是构建子菜单的循环,所有操作都是在这里进行的。

编辑:我想你的问题是,你只需要设置:

$submenu_file = \'post-new.php?post_type=uoms\'

结束

相关推荐

Admin Theme customization

我遵循wordpress codex网站上关于通过插件创建管理主题的说明。我激活了插件,但我的样式表没有包含在<head>.. 这是我的代码:add_action( \'admin_init\', \'kd_plugin_admin_init\' ); add_action( \'admin_menu\', \'kd_plugin_admin_menu\' ); function kd_plugin_admin_init() { /* Register