it-swarm.cn

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

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

基本上我有5个我创建的自定义帖子类型,我想要做的就是直接在 “仪表板” 下按特定顺序显示每个类型。

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

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

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

31
Binarybit

@BinaryBit:

难怪你有点沮丧;管理菜单是通过WordPress核心最令人沮丧和令人沮丧的实现之一。老实说,当他们以这种方式设计时,我不知道他们在想什么。

@EAMann做了一个优秀解释管理菜单如何在WordPress中工作的工作(我希望我能在大约4个月前阅读... :)

尽管如此,在我弄清楚它是如何工作之后我仍然无法使用它而没有花足够的时间来保持我的头脑,而我试图做简单的事情。 这就是为什么我构建了一个Menu API 简化并简化了WordPress管理菜单的使用。

它们与WordPress的现有结构100%兼容,并且仍然非常兼容alpha,因为我是唯一使用它的人。我确定有一些他们尚未处理的用例。但是我会在这里发布代码供你和其他人试用。

您可以 下载 要放在主题目录中的文件: 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中 所以如果我们很幸运,这些甚至可能成为标准!

33
MikeSchinkel

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

调用菜单文件

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

所以要加载菜单系统,admin.php只是requires menu.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进行索引。所以Dashboard的子菜单项“Dashboard”是:

 $submenu[ 'index.php' ][0] = array( __('Dashboard'), 'read', 'index.php' );

系统完成后加载所有菜单(没有那么多,但系统在时间上逐步通过索引5或10 ...注意,仪表板,即使它是第一个菜单项,仍然被索引为项目“2”(PHP数组从索引0开始......所以这给你一些机动空间)。

此时,系统调用wp-admin/includes/menu.php

单步执行菜单

第三个文件遍历每个菜单项,并根据分配给当前用户的权限,使用菜单或删除它。首先,它遍历所有子菜单并删除用户无法访问的页面。然后它循环遍历父页面并执行相同的操作。然后它删除任何仍然没有删除菜单的重复分隔符。

最后,它根据指定的菜单顺序对菜单进行排序。

订购自定义菜单

设置菜单后调用钩子admin_menu,但 之前 任何订购。因此,可以在不“破解”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');

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


编辑(9/2/2010):

要使用此方法指定自定义帖子类型的编辑屏幕的顺序,您需要知道编辑屏幕的URL。在大多数情况下,它将是http://blog.url/wp-admin/edit.php?post_type=POST_TYPE。这取决于WordPress在您的网站上的设置方式(如果它安装在根目录或子文件夹中)以及您正在使用的自定义帖子类型的slug。

例如...

假设您有“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');

菜单的其余部分不受影响,但您的自定义编辑页面将移动到与仪表板相同的部分,并将显示在其下方。您可以使用此选项将自定义帖子类型移动到管理菜单的任何部分,并按任意顺序放置。您也可以以相同的方式移动标准菜单项。

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

21
EAMann

我意识到这是一个老线程,但我认为值得用更简单的解决方案进行更新。请注意,这适用于3.5并且未经过任何其他版本的测试。以下代码可以放在插件或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');

管理员菜单中未列出的任何项目都不会被删除。它们将被附加到菜单的底部。

18
Matt

要移动菜单项,我喜欢使用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');

如果我想交换帖子和链接菜单:

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测试

2
forlogos

我知道您不想使用插件,但为了简单起见,请尝试Janis Elsts的Admin Menu Editor插件。以您喜欢的方式重新排列管理菜单;也可以隐藏菜单项。

2
Ray Gulick

真棒。非常感谢。我只是将一些代码放入我的functions.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 在我的主题文件夹中,现在'posts'按钮会被'pages'按钮所覆盖。

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

事实上,为4个按钮获得更明确的订单有点棘手。为了将4个按钮更改为:Pages,Post,Media,Links我需要使用以下代码:

  swap_admin_menu_sections('Pages','Posts');                
  swap_admin_menu_sections('Media','Links');                 
  swap_admin_menu_sections('Posts','Links');
0
Sebastian