On a related note to “Changing the Order of Admin Menu Sections?“, I’m looking for a way to alphabetically sort the entries in each sub-section of WordPress’s admin area.
Currently, whenever a new plugin is added, its entry will appear in a seemingly random location under Settings / Tools / Plugins, and it’s often hard to locate the new menu item. (I have a lot of plugins already, so my menus are pretty full.)
Being that I add and remove plugins fairly regularly, I would rather not need to continually go into the settings page for a menu-ordering plugin and adjust the order.
Sorry for the long question; I just want to make it clear what I’m looking for.
Example
Instead of:
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.
Can I have the menu sorted alphabetically (or by another logical method), e.g.:
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.
Even better would be a sort method that keeps the core entries where they are by default and only sorts items added by plugins:
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.
It can be done sorting the global
$submenu
.The sorting that’s applied resets the key number of the sub-array
$submenu['options-general.php']
, which is:and becomes:
Here, we are considering the length of the default items equal to six. Prior to WordPress 3.5, there were 7 items, Privacy is now gone and embedded with the Reading tab.
Testing locally, this doesn’t produce any unexpected result and works ok. Maybe if a plugin depended on
$submenu['options-general.php'][15]
to position itself or something else, bugs could happen.Sort is being applied separately for the default items and for the rest of them. Just disable the
usort
of the first block and you have your desired output.I was looking for the same thing and figured I would copy code provide by Mike below which he claims is still very much in alpha since its only been him that has been using it.
I have tested it and it seems to work well for me. I’m sure there are use-cases they do not yet handle.
Maybe Mike will comment in here and provide additional help on how you can use his class to achieve your goals.
You can download the file to drop in your theme’s directory here: https://gist.github.com/792b7aa5b695d1092520
What follows below shows how you might call the functions in your theme’s functions.php file:
What’s more, these functions are even under consideration (as a base) for inclusion in WordPress 3.1 so if we’re lucky these might even become standard!
Thought this could be useful as another option. Here is a simple usort on the global $submenu. I use admin_init hook, because admin_menu may still have other plugins adding submenu items (in my case it did, so that was too early to do sorting). Also note the anonymous (lambda) function in the usort requires PHP 5.3+.
Note that
$submenu_key
is$parent_slug
in add_submenu_page, which is the same as$menu_slug
in add_menu_page.