Trier les éléments du menu administrateur

8

Sur une note liée à " Changer l'ordre des sections du menu Admin? ", Je cherche un moyen de trier alphabétiquement les entrées dans chaque sous-section de la zone d'administration de WordPress.

Actuellement, chaque fois qu'un nouveau plugin est ajouté, son entrée apparaîtra dans un endroit apparemment aléatoire sous Paramètres / Outils / Plugins, et il est souvent difficile de localiser le nouvel élément de menu. (J'ai déjà beaucoup de plugins, donc mes menus sont assez complets.)

Étant donné que j'ajoute et supprime des plugins assez régulièrement, je préfère ne pas avoir besoin d'aller en permanence sur la page des paramètres pour un plugin de commande de menu et d'ajuster l'ordre.

Désolé pour la longue question; Je veux juste préciser ce que je recherche.

Exemple

Au lieu de:

    Réglages
    - Général
    - L'écriture
    - En train de lire
    - Discussion
    - (reste des éléments de base)
    - Plugin 4
    - WP quelque chose
    - Un plugin pour aider avec des trucs
    - Plugin lié à Google
    - Plugin RSS
    - Plugin FeedBurner
    - etc.

Puis-je faire trier le menu par ordre alphabétique (ou par une autre méthode logique), par exemple:

    Réglages
    - Un plugin pour aider avec des trucs
    - Discussion
    - Plugin FeedBurner
    - Général
    - Plugin lié à Google
    - Plugin 4
    - En train de lire
    - (reste des éléments de base)
    - Plugin RSS
    - WP quelque chose
    - L'écriture
    - etc.

Encore mieux serait une méthode de tri qui garde les entrées principales où elles sont par défaut et ne trie que les éléments ajoutés par les plugins:

    Réglages
    - Général
    - L'écriture
    - En train de lire
    - Discussion
    - (reste des éléments de base)
    - Un plugin pour aider avec des trucs
    - Plugin FeedBurner
    - Plugin lié à Google
    - Plugin 4
    - Plugin RSS
    - WP quelque chose
    - etc.
dgw
la source

Réponses:

4

Cela peut être fait en triant le global $submenu.

Le tri appliqué réinitialise le numéro de clé du sous-tableau $submenu['options-general.php'], qui est:

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

et devient:

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

Ici, nous considérons la longueur des éléments par défaut égale à six. Avant WordPress 3.5, il y avait 7 éléments, la confidentialité a maintenant disparu et intégrée à l' onglet Lecture .

Tester localement, cela ne produit aucun résultat inattendu et fonctionne bien. Peut-être que si un plugin dépendait $submenu['options-general.php'][15]de sa position ou de quelque chose d'autre, des bugs pourraient survenir.

Le tri est appliqué séparément pour les éléments par défaut et pour les autres. Désactivez simplement usortle premier bloc et vous avez la sortie souhaitée.

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;
}

éléments de menu réorganisés

brasofilo
la source
3

Je cherchais la même chose et je me suis dit que je copierais le code fourni par Mike ci-dessous, qui, selon lui, est toujours très bien en alpha car ce n'est que lui qui l'utilise.

Je l'ai testé et cela semble bien fonctionner pour moi. Je suis sûr qu'il existe des cas d'utilisation qu'ils ne gèrent pas encore.

Peut-être que Mike commentera ici et fournira une aide supplémentaire sur la façon dont vous pouvez utiliser sa classe pour atteindre vos objectifs.

Vous pouvez télécharger le fichier à déposer dans le répertoire de votre thème ici: https://gist.github.com/792b7aa5b695d1092520

Ce qui suit ci-dessous montre comment vous pouvez appeler les fonctions dans le fichier functions.php de votre thème:

<?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
}

De plus, ces fonctions sont même à l'étude (en tant que base) pour inclusion dans WordPress 3.1, donc si nous sommes chanceux, elles pourraient même devenir standard!

NetConstructor.com
la source
Cela ressemble à un bon morceau de code, mais je ne vois pas où il trie automatiquement les sous-entrées.
dgw
1

J'ai pensé que cela pourrait être utile comme autre option. Voici un usort simple sur le sous-menu global $. J'utilise le crochet admin_init, car admin_menu peut encore avoir d'autres plugins ajoutant des éléments de sous-menu (dans mon cas, c'était le cas, donc c'était trop tôt pour faire le tri). Notez également que la fonction anonyme (lambda) dans l'usort nécessite 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] );
        } );
    }
}

Notez que $submenu_keyc'est $parent_slugdans add_submenu_page , qui est le même que $menu_slugdans add_menu_page .

ryanm
la source
1
Agréable et compact. Qu'est-ce que $submenu_keyreprésenter? Est-ce ce que WordPress appelle $parent slugdans les documents add_submenu_page ?
random_user_name
@cale_b Grande question! Vous avez raison, c'est $parent_slugdans les documents add_submenu_page, ce qui est le même que $menu_slugdans add_menu_page.
ryanm