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


31

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

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

根据WordPress文档,您似乎无法真正做到这一点,因为最高菜单顺序似乎是“ 5”。L以上

我猜想有些专家在阅读本文时可以向我展示一种简单的方法,即可以通过使用功能文件而不使用插件(我知道存在)来完全按照自己的方式订购管理菜单。

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

Answers:


33

你好 @BinaryBit:

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

@EAMann在解释admin菜单在WordPress中的工作方式方面做得非常出色(我希望我能够在4个月前阅读它... :)

不过,在我弄清楚它是如何工作的之后,我仍然茫然无措地使用它,而没有花足够的时间让我直截了当地尝试做简单的事情。因此,这就是为什么我构建了一个菜单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中,因此,如果我们幸运的话,这些功能甚至可能成为标准功能!


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

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

这是否成为核心,还是在管理管理员中菜单项的顺序时仍需要此或类似方法?
Q Studio

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

嘿,迈克-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

21

这是WordPress管理菜单的构建方式的快速演练-我不是在说 add_menu_page API,而是指实际的默认WordPress菜单。

调用菜单文件

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

所以加载菜单系统,admin.php只是requireŞ menu.php...周围线99在WordPress 3.0。

载入菜单

菜单本身存储在全局数组中$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');

为所有菜单指定所需的顺序(我提供了菜单加载文件的引用,以便您可以获取文件名列表),这应该解决。


编辑(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');

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

只需确保指定给定部分中所有菜单项的顺序即可,否则您的菜单可能会出现一些意外情况。


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

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

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

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

@GiraldiMaggio 请问一个新问题,并参考这个问题
EAMann 2012年

18

我意识到这是一个旧线程,但是我认为值得使用更简单的解决方案进行更新。请注意,此功能适用于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');

管理菜单中未在此处列出的所有项目都不会被删除。它们将被添加到菜单的底部。


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

2

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


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

2

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

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中进行了测试


我知道这是一篇较旧的文章,但是关于您的第一个摘要,我遇到了admin_menu_items函数的最后一行的问题,该行的最后一行被替换为unset($menu[20]);
hot_barbara

0

太棒了 非常感谢。我只是将一些代码行放入我的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放在我的主题文件夹中,现在“帖子”按钮被“页面”按钮所覆盖。

我希望这将尽快成为核心的一部分,并以某种方式使我们不需要在函数内编写整个菜单,而只需对两个按钮重新排序。

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

  swap_admin_menu_sections('Pages','Posts');                
  swap_admin_menu_sections('Media','Links');                 
  swap_admin_menu_sections('Posts','Links');
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.