问题描述
我花了几个小时尝试完成这个相当简单的任务,没有任何运气,在这里有点沮丧。
本质上我有 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
只是 require
的 menu.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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。