排序管理员菜单项


8

在与“ 更改管理菜单部分的顺序? ” 的相关说明中,我正在寻找一种方法,可以按字母顺序对WordPress管理区域每个子部分中的条目进行排序。

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

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

很抱歉这个长问题;我只想弄清楚我在寻找什么。

代替:

    设定值
    - 一般
    - 写作
    - 阅读
    -讨论
    -(其余核心项目)
    -插件4
    -可湿性粉剂
    -一个可以帮助解决问题的插件
    -与Google相关的插件
    -RSS插件
    -FeedBurner插件
    -等

我可以按字母顺序(或通过其他逻辑方法)对菜单进行排序吗,例如:

    设定值
    -一个可以帮助解决问题的插件
    -讨论
    -FeedBurner插件
    - 一般
    -与Google相关的插件
    -插件4
    - 阅读
    -(其余核心项目)
    -RSS插件
    -可湿性粉剂
    - 写作
    -等

更好的排序方法是将核心条目保留在默认位置,并且仅对插件添加的项目进行排序:

    设定值
    - 一般
    - 写作
    - 阅读
    -讨论
    -(其余核心项目)
    -一个可以帮助解决问题的插件
    -FeedBurner插件
    -与Google相关的插件
    -插件4
    -RSS插件
    -可湿性粉剂
    -等

Answers:


4

可以对全局变量进行排序$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

在这里,我们正在考虑默认项目的长度等于六。在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;
}

重新排序的菜单项


3

我一直在寻找相同的东西,并认为我会复制Mike提供的代码,在下面他声称代码仍然处于alpha状态,因为只有他一直在使用它。

我已经对其进行了测试,它似乎对我来说效果很好。我确定有些用例尚未处理。

也许迈克会在这里发表评论,并就如何利用他的班级实现目标提供更多帮助。

您可以在以下位置下载文件以放入主题目录:https : //gist.github.com/792b7aa5b695d1092520

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


听起来像是很多代码,但是我看不到它在哪里对子条目进行自动排序。
dgw

1

认为这可能是另一个有用的选择。这是对全局$子菜单的简单使用。我使用admin_init钩子,因为admin_menu可能仍然有其他插件添加子菜单项(在我的情况下确实如此,因此进行排序还为时过早)。还要注意,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_slugadd_submenu_page,这是一样$menu_slugadd_menu_page


1
美观小巧。什么是$submenu_key代表?这就是WordPress $parent slugadd_submenu_page文档中所说的吗?
random_user_name

@cale_b很好的问题!您是正确的,它$parent_slug在add_submenu_page文档中,与$menu_slugadd_menu_page中的相同。
ryanm
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.