web-dev-qa-db-fra.com

Trier les éléments du menu administrateur

Sur une note associée à " Modification de l'ordre des sections du menu d'administration? ", je recherche un moyen de trier par ordre alphabétique les entrées de chaque sous-section de la zone d'administration de WordPress.

Actuellement, chaque fois qu'un nouveau plugin est ajouté, son entrée apparaît dans un emplacement 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 plutôt complets.)

Étant donné que j’ajoute et supprime des plug-ins assez régulièrement, je préférerais ne pas avoir besoin d'aller continuellement dans la page des paramètres pour un plug-in de commande de menus et d'ajuster l'ordre.

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

Exemple

Au lieu de:

 Paramètres 
 - Généralités 
 - Écrire 
 - Lire 
 - Discussion 
 - (reste des éléments principaux) 
 - Plugin 4 
 - WP quelque chose 
 - Un plugin pour vous aider avec des choses 
 - Plugin relatif à Google 
 - Plugin RSS 
 - Plugin FeedBurner 
 - etc. 

Puis-je avoir le menu trié alphabétiquement (ou par une autre méthode logique), par exemple:

 Paramètres 
 - Un plugin pour vous aider avec des choses 
 - Discussion 
 - Un plugin FeedBurner 
 - Général 
 - Un plugin lié à Google 
 - Plugin 4 
 - Lire 
 - (reste des éléments principaux) 
 - Plugin RSS 
 - WP quelque chose 
 - Écrire 
 - etc. 

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

 Paramètres 
 - Généralités 
 - Écrire 
 - Lire 
 - Discussion 
 - (reste des éléments principaux) 
 - Un plugin pour aider avec les choses 
 - Un plugin FeedBurner 
 - Un plugin relatif à Google 
 - Un plugin 4 
 - Un plugin RSS 
 - WP quelque chose 
 - etc. 
8
dgw

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

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 que la longueur des éléments par défaut est égale à six. Avant WordPress 3.5, il y avait 7 éléments, Privacy a maintenant disparu et est intégré à l'onglet Reading .

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

Le tri est appliqué séparément pour les éléments par défaut et pour le reste. Désactivez simplement la usort du premier bloc et vous obtenez 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;
}

 reordered menu items 

4
brasofilo

Je recherchais la même chose et pensais que je copierais le code fourni par Mike en dessous duquel il affirme qu’il est encore très 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 va commenter ici et fournir 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 montre comment vous pouvez appeler les fonctions du 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 l'inclusion dans WordPress 3.1. Si nous avons de la chance, elles pourraient même devenir standard!

3
NetConstructor.com

Pensé que cela pourrait être utile comme une autre option. Voici un simple usort sur le sous-menu global $. J'utilise admin_init hook, car admin_menu peut toujours avoir d'autres plugins qui ajoutent des éléments de sous-menu (dans mon cas, c'était trop tôt pour le tri). Notez également que la fonction anonyme (lambda) dans le port d’usage 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_key est $parent_slug dans add_submenu_page , ce qui est identique à $menu_slug dans add_menu_page .

1
ryanm