问题描述

我花了几个小时尝试完成这个相当简单的任务,没有任何运气,在这里有点沮丧。

本质上我有 5 个自定义的帖子类型,我创建的,我想做的是直接在”dashboard” 下以特定的顺序显示它们。

从 WordPress 文档看来,您不能真正做到这一点,因为最高的菜单顺序似乎是”5″ 。以上 L

我猜测一些专家阅读这可以告诉我一个简单的方法,我可以通过使用功能文件,而不使用插件 (我知道存在) 完全按照我想要的方式订购管理菜单。

请继续尝试创建 5 个单独的帖子类型,并将它们直接包含在仪表板下的特定顺序中… 似乎这是不可能的… … 有些类型的 jquery 黑客让这个工作有人可以与我分享,还是不用利用 jQuery?

最佳解决方案

嗨 @BinaryBit:

难怪你有点沮丧?管理菜单是通过 WordPress 核心最笨重和令人沮丧的实现之一。老实说,当他们这样设计的时候,我不知道他们在想什么。

@EAMann 做了很好的工作来解释管理员菜单在 WordPress 中的工作方式 (我希望我能够在大约 4 个月前阅读… 🙂

不过,在我弄清楚它是如何工作的,我仍然在失去工作,没有投入足够的时间来保持我的头直,而我试图做简单的事情。所以这就是为什么我建立一个菜单 API,简化和简化使用 WordPress 管理菜单。

它们与 WordPress 的现有结构 100%兼容,并且仍然非常适用于 alpha,因为我是唯一使用它的。我确定他们还没有处理 use-cases 。但是我会把代码放在这里,供你和其他人试用。

您可以下载文件以放在主题的目录中:wp-admin-menu-classes.php,下面显示了如何调用主题 functions.php 文件中的功能:

<?php
require_once('wp-admin-menu-classes.php');
add_action('admin_menu','my_admin_menu');
function my_admin_menu() {
  swap_admin_menu_sections('Pages','Posts');              // Swap location of Posts Section with Pages Section
  rename_admin_menu_section('Media','Photos & Video');    // Rename Media Section to "Photos & Video"
  delete_admin_menu_section('Links');                     // Get rid of Links Section
  $movie_tags_item_array = get_admin_menu_item_array('Movies','Movie Tags');  // Save off the Movie Tags Menu
  update_admin_menu_section('Movies',array(               // Rename two Movie Menu Items and Delete the Movie Tags Item
    array('rename-item','item'=>'Movies','new_title'=>'List Movies'),
    array('rename-item','item'=>'Add New','new_title'=>'Add Movie'),
    array('delete-item','item'=>'Movie Tags'),
  ));
  copy_admin_menu_item('Movies',array('Actors','Add New')); // Copy the 'Add New' over from Actors
  renamed_admin_menu_item('Movies','Add New','Add Actor');  // Rename copied Actor 'Add New' to 'Add Actor
  add_admin_menu_item('Movies',array(                       // (Another way to get a 'Add Actor' Link to a section.)
    'title' => 'Alt Add Actor ',
    'slug' => 'post-new.php?post_type=actor',
  ), array(// Add Back the Movie Tags at the end.
    'where'=>'end'
  ));
  add_admin_menu_item('Movies',$movie_tags_item_array,array(// Add Back the Movie Tags at the end.
    'where'=>'end'
  ));
  delete_admin_menu_section('Actors');                      // Finally just get rid of the actors section
}

此外,这些功能甚至被考虑 (作为基础) 包含在 WordPress 3.1 中,所以如果我们幸运,甚至可能成为标准!

次佳解决方案

这是一个快速的演示文稿如何构建 WordPress 管理菜单 – 我不是说 add_menu_page API,我的意思是实际的默认 WordPress 菜单。

调用菜单文件

菜单显然由 wp-admin/admin.php 加载。但是它没有通过我们习惯使用基于 WordPress 文档的标准 API 加载。相反,整个菜单 (所有可能的选项,子菜单等) 都是通过 wp-admin/menu.php 中定义的简单数组加载的。

所以要加载菜单系统,admin.php 只是 requiremenu.php … 在 WordPress 3.0 中的第 99 行。

加载菜单

菜单本身存储在全局数组 $menu 中。根据 in-line 文档,菜单数组有以下元素:

The elements in the array are:
    *     0: Menu item name
    *     1: Minimum level or capability required.
    *     2: The URL of the item's file
    *     3: Class
    *     4: ID
    *     5: Icon for top level menu

例如,仪表板是:

$menu[2] = array( __('Dashboard'), 'read', 'index.php', '', 'menu-top menu-top-first menu-icon-dashboard', 'menu-dashboard', 'div' );

该文件经过并将每个菜单项加载到数组中,并将所有的 sub-menu 项目加载到一个名为 $submenu 的数组中,该数组根据父菜单的 URL 进行索引。所以仪表板的子菜单项”Dashboard” 是:

 $submenu[ 'index.php' ][0] = array( __('Dashboard'), 'read', 'index.php' );

系统完成后加载所有菜单 (没有那么多,但是系统通过索引在 5 或 10 时间步进… 注意到,即使是第一个菜单项,仪表板仍然被编入索引项目”2″(PHP 数组从索引 0 开始… 所以这给你一些机动的空间) 。

此时系统调用 wp-admin/includes/menu.php

踏上菜单

第三个文件遍历每个菜单项,并根据分配给当前用户的权限,使用菜单或将其删除。首先它循环遍历所有的 sub-menus,并删除用户无法访问的页面。然后它循环遍历父页面,做同样的事情。然后,它会删除任何重复的分隔符,从而删除菜单。

最后,它根据分配的菜单顺序对菜单进行排序。

订购自定义菜单

挂钩 admin_menu 在菜单设置后,但任何东西都被订购之前被调用。所以可以在没有”hacking” API 的情况下订购整个 WordPress 菜单系统。

操作 admin_menu 被触发后,您的自定义页面将加载到系统中。接下来的事情是 WordPress 检查一个名为 custom_menu_order 的过滤器… 这个过滤器总是返回 false 并告诉 WordPress 是否要使用自定义的顺序。

将以下内容添加到主题中,将标志设置为 true,并定义您的显式菜单顺序:

function custom_menu_order($menu_ord) {
       if (!$menu_ord) return true;
       return array('index.php', 'edit.php', 'edit-comments.php');
}

add_filter('custom_menu_order', 'custom_menu_order');
add_filter('menu_order', 'custom_menu_order');

指定所有菜单所需的顺序 (我提供了对 menu-loading 文件的引用,以便您可以获得一个文件名列表),这应该会照顾它。


编辑 (9/2/2010):

要使用此方法指定自定义帖子类型的编辑屏幕的顺序,您需要知道编辑屏幕的 URL 。我大多数情况下,会是 http://blog.url/wp-admin/edit.php?post_type=POST_TYPE 。这取决于 WordPress 如何在您的网站上设置 (如果它安装在根目录或子文件夹中) 以及您使用的自定义帖子类型的部分。

例如…

假设您有 「Stack Exchange Questions」 的自定义帖子类型,并希望编辑器与仪表板图标正下方的仪表板显示在相同的部分。您将在主题的 functions.php 文件中使用以下代码:

function custom_menu_order($menu_ord) {
       if (!$menu_ord) return true;
       return array('index.php', 'edit.php?post_type=stack_exchange_questions');
}

add_filter('custom_menu_order', 'custom_menu_order');
add_filter('menu_order', 'custom_menu_order');

菜单的其余部分将不受影响,但您的自定义编辑页面将被移动到与仪表板相同的部分,并将在其下方显示。您可以使用它将自定义帖子类型移动到管理菜单的任何部分,并将它们放在任何顺序中。您也可以以相同的方式移动标准菜单项。

只要确定您在给定的部分指定所有菜单项的顺序,否则您的菜单可能会受到一些意想不到的奇怪。

第三种解决方案

我意识到这是一个旧的线程,但我认为这是更值得更新一个更容易的解决方案。请注意,这适用于 3.5,并没有任何其他版本的测试。以下代码可以放在 plugin 或 functions.php 文件中。

参见:http://codex.wordpress.org/Plugin_API/Filter_Reference/menu_order 。稍微修改以适应原始海报的需求 (虽然,我希望他现在找到一个解决方案…) 。

  // Rearrange the admin menu
  function custom_menu_order($menu_ord) {
    if (!$menu_ord) return true;
    return array(
      'index.php', // Dashboard
      'edit.php?post_type=custom_type_one', // Custom type one
      'edit.php?post_type=custom_type_two', // Custom type two
      'edit.php?post_type=custom_type_three', // Custom type three
      'edit.php?post_type=custom_type_four', // Custom type four
      'edit.php?post_type=custom_type_five', // Custom type five
      'separator1', // First separator
      'edit.php?post_type=page', // Pages
      'edit.php', // Posts
      'upload.php', // Media
      'link-manager.php', // Links
      'edit-comments.php', // Comments
      'separator2', // Second separator
      'themes.php', // Appearance
      'plugins.php', // Plugins
      'users.php', // Users
      'tools.php', // Tools
      'options-general.php', // Settings
      'separator-last', // Last separator
    );
  }

  add_filter('custom_menu_order', 'custom_menu_order'); // Activate custom_menu_order
  add_filter('menu_order', 'custom_menu_order');

管理员菜单中未列出的任何项目都不会被删除。它们将被附加到菜单的底部。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。