花了几个小时试图完成这个相当简单的任务而没有任何运气之后,我对此感到有些沮丧。

基本上,我创建了5种自定义帖子类型,我要做的就是在“仪表盘”下直接按特定顺序显示它们。

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

我想这是一些专家的阅读,它可以向我展示一种简单的方法,即我可以通过使用功能文件完全按照我想要的方式订购管理菜单,而无需使用插件(我知道存在)。

请继续尝试创建5个单独的帖子类型,并按特定顺序将它们直接包含在仪表板下...这似乎是不可能的。 ...是否有某种类型的jquery hack可以使这项工作与他人共享,或者最好不使用jQuery而共享?

#1 楼

@BinaryBit,您好:

难怪您会感到沮丧。通过WordPress核心,管理菜单是最令人费解和令人沮丧的实现之一。老实说,我不知道他们以这种方式设计时的想法。大约4个月前... :)

但是,在我弄清楚它是如何工作的之后,我仍然茫然地使用它,而没有花足够的时间来保持自己的头脑直率做简单的事情。这就是为什么我构建了一个菜单API来简化和简化与WordPress管理菜单一起使用的原因。

它们与WordPress的现有结构100%兼容,但由于我是唯一使用它的人,所以它们仍处于alpha版本。我确定有些用例尚未处理。但是,我会将代码发布在这里,供您和其他人试用。您如何调用主题的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中,因此如果我们很幸运,这些甚至可能成为标准!

评论


API的绝佳补充!我花了几个月的时间在现有框架中添加了我的第一个自定义菜单部分(这就是为什么我研究代码的原因很多)……但是您的API使用起来似乎更加直观!

–EAMann
2010年9月2日,下午4:10

@EAMann-谢谢!如果您想提出任何建议,甚至要合作进行改进,我希望建立一些可以使每个人都更容易的东西,除了少数碰巧看到此问答的人。

– MikeSchinkel
2010年9月3日在8:19

这是否成为核心,还是在管理管理员中菜单项的顺序方面仍需要这样做?

– Q Studio
2012年9月12日14:16在

据我所知,它已被推迟到WP 3.5

– Pixeline
2012年9月22日在22:23

嘿,迈克-wp_debug在此函数上引发错误:--------函数swap_admin_menu_sections($ from_section,$ to_section){$ from_section = get_admin_menu_section($ from_section);如果($ from_section)$ from_section-> swap_with($ to_section);返回$ section; } ---注意:未定义的变量:部分

– Q Studio
2012年10月11日9:57



#2 楼

这是WordPress管理员菜单的构建方式的快速演练-我不是在说add_menu_page API,而是实际的默认WordPress菜单。
调用菜单文件wp-admin/admin.php。但是它不是通过我们习惯于根据WordPress文档使用的标准API加载的。而是,整个菜单(所有可能的选项,子菜单等)都是通过wp-admin/menu.php中定义的简单数组加载的。 。
加载菜单
菜单本身存储在全局数组admin.php中。根据在线文档,菜单数组包含以下元素:
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' );

文件通过并加载每个菜单项放入数组并将其所有子菜单项加载到名为require的数组中,该数组根据父菜单的url进行索引。因此,仪表板的子菜单项称为“仪表板”: ...请注意,尽管仪表板是第一个菜单项,但仍仍被索引为项目“ 2”(PHP数组从索引0开始,因此为您提供了一些操作空间)。 ,系统将调用menu.php
单步执行菜单
该第三个文件将遍历每个菜单项,并根据分配给当前用户的权限使用或删除菜单。所有子菜单并删除用户无法访问的页面,然后循环浏览父页面并执行相同的操作,然后删除消除菜单后残留的所有重复分隔符。根据其分配的菜单顺序。
订购自定义菜单
在设置菜单之后但未订购任何东西之前,将调用$menu挂钩。这样就可以订购整个WordPress菜单系统,而无需“破坏” API。
触发$submenu操作后,您的自定义页面就会加载到系统中。接下来发生的事情是WordPress检查一个名为wp-admin/includes/menu.php的过滤器...该过滤器始终返回admin_menu并告诉WordPress您是否要使用自定义订单。
在主题中添加以下内容以设置标志改为admin_menu并定义您的显式菜单顺序:
 $submenu[ 'index.php' ][0] = array( __('Dashboard'), 'read', 'index.php' );

为所有菜单指定所需的顺序(我提供了菜单加载文件的引用,因此您可以获得文件名列表)

EDIT(9/2/2010):
要使用此方法指定自定义帖子类型的编辑屏幕的顺序,您需要知道编辑画面。在大多数情况下,它将是custom_menu_order。这取决于您网站上WordPress的设置方式(如果它是安装在根目录或子文件夹中)以及您所使用的自定义帖子类型的标签。
例如...
假设您有一个针对“ Stack Exchange Questions”的自定义帖子类型,并且您希望编辑器显示在与仪表板相同的部分,位于仪表板图标的正下方。您将在主题的false文件中使用以下代码:
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');

菜单的其余部分将不受影响,但您的自定义编辑页面将移至与仪表板相同的部分,并立即显示在它下面。您可以使用此选项将自定义帖子类型移动到管理菜单的任何部分,并以任何顺序放置它们。您也可以以相同的方式移动标准菜单项。
请确保在给定的部分中指定所有菜单项的顺序,否则您的菜单可能会出现一些意外的怪异。

评论


您的示例代码中“订购自定义菜单”标题下有一个小错误,如果条件语句缺少变量名称上的$ ...(虽然很好的答案)。

– t31os
10 Nov 17 '15:24

您如何将“堆栈交换问题”的自定义帖子类型添加到“仪表板”部分下面的部分?

–分隔符
2011年5月31日下午4:32

嗨,EAMann-快速提问。自从最新版本的wordpress以来,此过程有没有改变或变得更简单?

– NetConstructor.com
2011-09-14 19:26

子菜单怎么样?是否有类似的方法来重新排列子菜单项?

– Giraldi
2012年11月16日9:47

@GiraldiMaggio请问一个新问题,并参考这个问题。

–EAMann
2012年11月16日17:09

#3 楼

我意识到这是一个旧线程,但是我认为值得使用更简单的解决方案进行更新。请注意,此功能适用于3.5,尚未经过任何其他版本的测试。可以将以下代码放在插件或functions.php文件中。

请参阅:http://codex.wordpress.org/Plugin_API/Filter_Reference/menu_order。进行了略微修改,以适应原始海报的需求(尽管,我希望他现在找到了解决方案...)。此处列出的内容不会被删除。它们将被添加到菜单的底部。

评论


是的,这样更好,也可以重新排序您可以取消设置然后重新设置的子菜单项。

–维克
2012年12月20日20:11在

#4 楼

我了解您不希望使用插件,但为简单起见,请尝试使用Janis Elsts的Admin Menu Editor插件。您可以根据自己的喜好重新排列管理菜单;也可以隐藏菜单项。

评论


我在多站点安装中尝试了此插件,效果最佳。但是,如果我们有多站点安装,则需要为每个子站点手动配置选项。

–user391
10-10-13在15:07

#5 楼

要移动菜单项,我喜欢使用Global $menu变量。

例如,如果我想将“页面”菜单移到菜单底部,可以在functions.php或插件中使用:

function admin_menu_items() {
    global $menu;
    $menu[102]=$menu[20];//make menu 102 be the same as menu 20 (pages)
    $menu[20]=array();//make original pages menu disappear

}
add_action('admin_menu', 'admin_menu_items');


,如果我想交换Posts and Links菜单: br />

评论


我知道这是一篇较旧的文章,但是关于您的第一个片段,我遇到了一个问题,即admin_menu_items函数的最后一行,该问题已通过使用unset($ menu [20])替换而得以解决。

– hot_barbara
17年8月4日在21:16

#6 楼

太棒了非常感谢。
我只是在我的functions.php文件中添加了几行代码。现在,“帖子”按钮和“页面”按钮都变成了空白。只需重新排序两个按钮的功能。

实际上,要为4个按钮获得更指定的顺序有点麻烦。 ,媒体,链接
我需要使用以下代码:

require_once('/extras/wp-admin-menu-classes.php');
add_action('admin_menu','my_admin_menu');
function my_admin_menu() {
  swap_admin_menu_sections('Pages','Posts'); // Swop location of Posts Section with Pages Section
}