Sort admin menu items

时间:2010-09-28 作者:dgw

关于“的相关注释”Changing the Order of Admin Menu Sections?“,我正在寻找一种按字母顺序对WordPress管理区域的每个子部分中的条目进行排序的方法。

目前,每当添加新插件时,其条目都会出现在“设置/工具/插件”下看似随机的位置,通常很难找到新的菜单项。(我已经有很多插件了,所以我的菜单很满。)

由于我相当经常地添加和删除插件,所以我宁愿不需要不断进入设置页面来获取菜单排序插件并调整顺序。

抱歉问了这么长的问题;我只是想弄清楚我在找什么。

示例代替:

    Settings
    - General
    - Writing
    - Reading
    - Discussion
    - (rest of core items)
    - Plugin 4
    - WP something
    - A plugin to help with stuff
    - Google-related plugin
    - RSS plugin
    - FeedBurner plugin
    - etc.
是否可以按字母顺序(或其他逻辑方法)对菜单进行排序,例如:

    Settings
    - A plugin to help with stuff
    - Discussion
    - FeedBurner plugin
    - General
    - Google-related plugin
    - Plugin 4
    - Reading
    - (rest of core items)
    - RSS plugin
    - WP something
    - Writing
    - etc.
更好的排序方法是将核心条目保留在默认位置,只对插件添加的条目进行排序:

    Settings
    - General
    - Writing
    - Reading
    - Discussion
    - (rest of core items)
    - A plugin to help with stuff
    - FeedBurner plugin
    - Google-related plugin
    - Plugin 4
    - RSS plugin
    - WP something
    - etc.

3 个回复
SO网友:brasofilo

可以对全局$submenu.

应用的排序将重置子数组的键号$submenu[\'options-general.php\'], 即:

array
  \'options-general.php\' => 
    array
      10 => 
        array
          0 => string \'General\'
          1 => string \'manage_options\'
          2 => string \'options-general.php\'
      15 => 
        array
          0 => string \'Writing\'
          1 => string \'manage_options\'
          2 => string \'options-writing.php\'
      // etc
并成为:

array
  \'options-general.php\' => 
    array
      0 => 
        array
          0 => string \'Discussion\'
          1 => string \'manage_options\'
          2 => string \'options-discussion.php\'
      1 => 
        array
          0 => string \'General\'
          1 => string \'manage_options\'
          2 => string \'options-general.php\'
      // etc
这里,我们考虑默认项的长度等于6。在WordPress 3.5之前,共有7项,现在隐私消失了,并嵌入了阅读选项卡。

在本地测试时,这不会产生任何意外的结果,并且工作正常。如果插件依赖于$submenu[\'options-general.php\'][15] 为了定位自身或其他东西,可能会发生错误。

正在分别对默认项和其余项应用排序。只需禁用usort 第一个块,您就有了所需的输出。

add_action( \'admin_menu\', \'sort_settings_menu_wpse_2331\', 999 );

function sort_settings_menu_wpse_2331() 
{
    global $submenu;

    // Sort default items
    $default = array_slice( $submenu[\'options-general.php\'], 0, 6, true );
    usort( $default, \'sort_arra_asc_so_1597736\' );

    // Sort rest of items
    $length = count( $submenu[\'options-general.php\'] );
    $extra = array_slice( $submenu[\'options-general.php\'], 6, $length, true );
    usort( $extra, \'sort_arra_asc_so_1597736\' );

    // Apply
    $submenu[\'options-general.php\'] = array_merge( $default, $extra );
}

//http://stackoverflow.com/a/1597788/1287812
function sort_arra_asc_so_1597736( $item1, $item2 )
{
    if ($item1[0] == $item2[0]) return 0;
    return ( $item1[0] > $item2[0] ) ? 1 : -1;
}

reordered menu items

SO网友:NetConstructor.com

我也在寻找同样的东西,我想我会复制Mike提供的代码,他声称下面的代码仍然是alpha,因为只有他在使用它。

我已经测试过了,它似乎对我很有效。我确信有一些用例他们还没有处理。

也许Mike会在这里发表评论,并提供额外的帮助,帮助您如何利用他的课程来实现您的目标。

您可以下载该文件,将其放在主题的目录中:https://gist.github.com/792b7aa5b695d1092520

下面的内容显示了如何调用主题函数中的函数。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中,所以如果我们幸运的话,这些函数甚至可能成为标准!

SO网友:ryanm

认为这可能是另一个有用的选择。下面是global$子菜单上的一个简单usort。我使用admin\\u init hook,因为admin\\u菜单可能还有其他插件添加子菜单项(在我的情况下是这样的,所以现在进行排序还为时过早)。还要注意,usort中的匿名(lambda)函数需要PHP 5.3+。

<?php 
add_action(\'admin_init\',\'my_admin_init\');
function my_admin_init() {
    global $submenu;
    $submenu_key = \'my_key\'; // See note below on $submenu_key
    if ( array_key_exists( $submenu_key, $submenu ) ) {
        // alphabetize submenu items
        usort( $submenu[ $submenu_key ], function ( $a, $b ) {
            // format of a submenu item is [ \'My Item\', \'read\', \'manage-my-items\', \'My Item\' ]
            return strcasecmp( $a[0], $b[0] );
        } );
    }
}
请注意$submenu_key$parent_slug 在里面add_submenu_page, 这和$menu_slug 在里面add_menu_page.

结束

相关推荐

WP-ADMIN似乎正在重定向

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