这是WordPress管理菜单的构建方式的快速演练-我不是在说 add_menu_page
API,而是指实际的默认WordPress菜单。
调用菜单文件
菜单显然是由加载的wp-admin/admin.php
。但是,它不是通过我们习惯于根据WordPress文档使用的标准API加载的。相反,整个菜单(所有可能的选项,子菜单等)都是通过在中定义的简单数组加载的wp-admin/menu.php
。
所以加载菜单系统,admin.php
只是require
Ş menu.php
...周围线99在WordPress 3.0。
载入菜单
菜单本身存储在全局数组中$menu
。根据在线文档,菜单数组包含以下元素:
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' );
该文件遍历并将每个菜单项加载到数组中,并将其所有子菜单项加载到称为数组的数组中$submenu
,该数组根据父菜单的url进行索引。因此,仪表板的子菜单项“仪表板”为:
$submenu[ 'index.php' ][0] = array( __('Dashboard'), 'read', 'index.php' );
在系统加载完所有菜单之后(没有那么多菜单,但是系统会按5或10的时间逐步执行索引...请注意,尽管仪表板是第一个菜单项,但仍会被索引为项目“ 2”(PHP数组从索引0开始……因此这为您提供了一些操作空间)。
此时,系统调用wp-admin/includes/menu.php
。
逐步浏览菜单
第三个文件遍历每个菜单项,并根据分配给当前用户的权限使用菜单或将其删除。首先,它循环浏览所有子菜单,并删除用户无法访问的页面。然后,它遍历父页面并执行相同的操作。然后,它从消除的菜单中删除所有残留的重复分隔符。
最后,它根据菜单分配的菜单顺序对其进行排序。
订购自定义菜单
admin_menu
在设置菜单之后但未订购任何东西之前,将调用该挂钩。因此,可以订购整个WordPress菜单系统而无需“破解” API。
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');
为所有菜单指定所需的顺序(我提供了菜单加载文件的引用,以便您可以获取文件名列表),这应该解决。
编辑(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');
菜单的其余部分将不受影响,但是您的自定义编辑页面将被移至与仪表板相同的部分,并将立即显示在其下方。您可以使用此选项将自定义帖子类型移动到管理菜单的任何部分,并以任何顺序放置它们。您也可以以相同方式移动标准菜单项。
只需确保指定给定部分中所有菜单项的顺序即可,否则您的菜单可能会出现一些意外情况。