是否更改管理菜单部分的顺序?

时间:2010-09-01 作者:Binarybit

我在这里感到有点沮丧,因为我花了几个小时试图完成这项相当简单的任务,却没有任何运气。

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

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

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

请继续,尝试创建5种不同的帖子类型,并将它们按特定顺序直接包含在仪表板下。。。看来这是不可能的。??。。。是否有某种类型的jquery黑客可以完成这项工作,有人可以与我共享,或者最好不使用jquery?

6 个回复
最合适的回答,由SO网友:MikeSchinkel 整理而成

你好@BinaryBit:

难怪你有点沮丧;管理菜单是WordPress核心中最迟钝、最令人沮丧的实现之一。老实说,我不知道他们那样设计的时候在想什么。

@埃曼做了一个excellent 解释管理菜单如何在WordPress中工作的工作(我希望我能在大约4个月前读到…:)

尽管如此,在我弄清楚它是如何工作的之后,我仍然无法在尝试做简单的事情时,没有花足够的时间保持头脑清醒。So that\'s why I built a Menu API 这简化了WordPress管理菜单的使用。

它们与WordPress的现有结构完全兼容,而且仍然非常符合alpha,因为我是唯一一个使用它的人。我确信有一些用例他们还没有处理。但我会在这里发布代码,供您和其他人试用。

你可以download 要放置在主题目录中的文件如下: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
}
更重要的是,这些函数甚至under consideration (as a base) for inclusion in WordPress 3.1 所以如果我们幸运的话,这些甚至可能成为标准!

SO网友:EAMann

这里有一个关于WordPress管理菜单是如何构建的快速演练-我不是说add_menu_page API,我指的是实际的默认WordPress菜单。

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

所以要加载菜单系统,admin.php 只是requiresmenu.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\');
菜单的其余部分将不受影响,但您的自定义编辑页面将移动到与仪表板相同的部分,并立即显示在其下方。您可以使用此功能将自定义帖子类型移动到“管理”菜单的任何部分,并按任意顺序放置它们。您也可以用同样的方法移动标准菜单项。

只需确保指定给定部分中所有菜单项的顺序,否则您的菜单可能会出现一些意想不到的奇怪之处。

SO网友:Matt

我意识到这是一个旧线程,但我认为值得用一个更简单的解决方案进行更新。请注意,这适用于3.5,尚未在任何其他版本中进行测试。以下代码可以放在插件或函数中。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\');
“管理”菜单中未列出的任何项目都不会被删除。它们将附加到菜单的底部。

SO网友:Ray Gulick

我知道你不想使用插件,但为了简单起见,可以试试Janis Elsts的管理菜单编辑器插件。按照您喜欢的方式重新安排您的管理菜单;也可以隐藏菜单项。

SO网友:forlogos

要移动菜单项,我喜欢使用全局$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\');
如果我想交换帖子和链接菜单:

function admin_menu_items() {
    global $menu;
    $storemenu = $menu[15];//save links menu into $storemenu
    $menu[15] = $menu[5];//make links menu = posts menu
    $menu[5] = $storemenu; //make menu 5/posts = $storemenu/links   
}
add_action(\'admin_menu\', \'admin_menu_items\');
使用此技巧有一段时间了,刚刚使用WP 3.4.1进行了测试

SO网友:Sebastian

令人惊叹的非常感谢。我只是在函数中加入了几行代码。php

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
}
加上放置wp-admin-menu-classes.php 在我的主题文件夹中,现在“帖子”按钮与“页面”按钮切换。

我希望这将很快成为核心的一部分,这样我们就不需要在一个函数中编写整个菜单来重新排序两个按钮。

事实上,要获得4个按钮的更具体的顺序有点棘手。要将4个按钮中的更改为:页面、帖子、媒体、链接,我需要使用以下代码:

  swap_admin_menu_sections(\'Pages\',\'Posts\');                
  swap_admin_menu_sections(\'Media\',\'Links\');                 
  swap_admin_menu_sections(\'Posts\',\'Links\');

结束

相关推荐

WP-ADMIN似乎正在重定向

我的w-admin登录有一个奇怪的问题。这是从我升级到3.0以后才开始的,当我转到wp admin时,登录表单显示正常,但当我输入用户名并通过时,每次都会再次显示登录表单。使用密码恢复功能会导致电子邮件未找到错误。我知道用户名密码和电子邮件是正确的,b/c我可以访问mysql数据库,我可以看到值(至少用户名和电子邮件) 有人知道会出什么问题吗