这里有一个关于WordPress管理菜单是如何构建的快速演练-我不是说add_menu_page
API,我指的是实际的默认WordPress菜单。
调用菜单文件,菜单显然是由wp-admin/admin.php
. 但它并不是通过我们习惯使用的基于WordPress文档的标准API加载的。而是通过中定义的简单数组加载整个菜单(所有可能的选项、子菜单等)wp-admin/menu.php
.
所以要加载菜单系统,admin.php
只是require
smenu.php
... WordPress 3.0中第99行附近。
加载菜单菜单本身存储在全局数组中$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\');
为所有菜单指定所需的顺序(我提供了对菜单加载文件的引用,以便您可以获得文件名列表),这应该可以解决这个问题。
编辑(2010年9月2日):要使用此方法指定自定义帖子类型的编辑屏幕的顺序,您需要知道编辑屏幕的URL。大多数情况下http://blog.url/wp-admin/edit.php?post_type=POST_TYPE
. 这取决于WordPress在您的站点上的设置方式(如果安装在根目录或子文件夹中)以及您使用的自定义帖子类型的slug。
例如
假设您有一个用于“堆栈交换问题”的自定义帖子类型,并且希望编辑器与仪表板图标正下方的仪表板显示在同一部分中。在主题的
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\');
菜单的其余部分将不受影响,但您的自定义编辑页面将移动到与仪表板相同的部分,并立即显示在其下方。您可以使用此功能将自定义帖子类型移动到“管理”菜单的任何部分,并按任意顺序放置它们。您也可以用同样的方法移动标准菜单项。
只需确保指定给定部分中所有菜单项的顺序,否则您的菜单可能会出现一些意想不到的奇怪之处。