在子菜单+自定义标题中使用自定义帖子类型

时间:2012-03-06 作者:Kelley van Evert

我计划为我的一个插件使用几个自定义帖子类型。整个插件应该位于1个顶级菜单项下。因此,我更喜欢这样的菜单结构:

仪表板贴子

自定义帖子类型#1

  • 自定义帖子类型#2
  • […]\'show_in_menu\' => \'my_plugin_toplevel_menu_item_slug\' 在里面register_post_type 注册自定义帖子类型时。然而,我在使用这种方法时遇到了一些问题。

    我对如何输出标题没有发言权。我更愿意使用<h2 class="nav-tab-wrapper"> ... </h2>, 但现在发布。php为我打印h2输出,我不知道有什么简单的方法可以覆盖它。页面一加载就可以用javascript实现这一点,但在我看来这有点难看\'show_in_menu\', 无法更改子菜单页面顺序。自定义的帖子类型会自动放在顶部,因为我想Wordpress会比我更快地找到它

    Update

    请参阅下面我的答案中的临时解决方案。

  • 1 个回复
    SO网友:Kelley van Evert

    (临时?)我选择的解决方案如下:

    使用show_in_menu 的参数register_post_type

  • 使用javascript在页面加载后显示自定义标题,使用以下帮助函数解决子菜单页面顺序(自动将自定义帖子类型置于顶部,这不是我的意图):
    1. 。。。

      // Sort the children of a given toplevel menu item
      // Keep original order intact as much as possible, while
      //  enforcing the [before => after] rules given by $force_order
      function help_sort_submenu_items($toplevel_slug, $force_order) {
        global $submenu;
      
        $done = array();
        $hold = array();
        $newmenu = array();
      
        foreach ($submenu[$toplevel_slug] as $i => $item) {
          $force_after = array_search($item[2], $force_order);
          if ($force_after !== false && empty($done[$force_after])) {
            $hold[$item[2]] = $item;
          } else {
            $newmenu []= $item;
            $done[$item[2]] = true;
      
            $just_added_id = $item[2];
            while ($just_added_id = $force_order[$just_added_id]) {
              $next = $hold[$just_added_id];
              $newmenu []= $next;
              $done[$just_added_id] = true;
            }
          }
        }
      
        $submenu[$toplevel_slug] = $newmenu;
      }
      
      用法如下:

      help_sort_submenu_items(\'my_plugin_toplevel_menu_item_slug\', array(
        \'submenu_page_with_this_slug_comes_before\' => \'submenu_page_with_this_slug\',
        \'another\' => \'rule\'
      ));
      

    结束

    相关推荐

    Order Admin sub-menu items?

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