Modification de l'ordre des sections du menu Admin?

30

Je suis un peu frustré après avoir passé quelques heures à essayer d'accomplir cette tâche assez simple sans aucune chance.

J'ai essentiellement créé 5 types de publication personnalisés et tout ce que je veux faire est de les afficher chacun dans un ordre spécifique directement sous le "tableau de bord" .

D'après la documentation WordPress, il semble que vous ne puissiez pas vraiment faire cela car l'ordre du menu le plus élevé semble être "5". Et ci-dessus L

Je suis en train de deviner que certains experts en la matière peuvent me montrer comment commander le menu administrateur exactement comme je le souhaite, en utilisant le fichier de fonctions et sans utiliser de plugin (qui, je le sais, existe).

Allez-y, essayez de créer 5 types de publication distincts et de les inclure dans un ordre spécifique directement sous le tableau de bord ... il semble que ce ne soit pas possible. ?? ... existe-t-il un type de bidouillage permettant de le faire? travailler que quelqu'un pourrait partager avec moi ou de préférence sans utiliser jQuery?

    
posée Binarybit 02.09.2010 - 01:46
la source

6 réponses

33

Bonjour @BinaryBit:

Il n’est pas étonnant que vous soyez un peu frustré; le menu admin est l’une des implémentations les plus obtuses et frustrantes de WordPress. Honnêtement, je ne sais pas à quoi ils pensaient quand ils l’ont conçu de cette façon.

@EAMann a fait un excellent exercice sur le fonctionnement des menus d’administrateur dans WordPress (j’aurais aimé pouvoir vous en informer. Il y a 4 mois ... :)

Pourtant, après avoir compris comment cela fonctionnait, je ne pouvais toujours pas travailler avec cela sans consacrer suffisamment de temps pour garder la tête droite alors que j'essayais de faire des choses simples. C’est pourquoi j’ai créé une API de menu qui simplifie et simplifie l’utilisation du menu d’administration de WordPress.

Ils sont 100% compatibles avec les structures existantes de WordPress et sont encore très largement en alpha puisque je suis le seul à l’utiliser. Je suis sûr qu'il existe des cas d'utilisation qu'ils ne gèrent pas encore. Mais je posterai le code ici pour que vous et les autres puissiez l'essayer.

Vous pouvez télécharger le fichier à déposer dans le répertoire de votre thème ici: wp-admin -menu-classes.php et ce qui suit montre comment 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) en vue de leur inclusion dans WordPress 3.1 alors, si nous avons de la chance, ils pourraient même devenir standard!

    
réponse donnée MikeSchinkel 02.09.2010 - 03:56
la source
20

Voici un aperçu de la construction du menu d'administration de WordPress. Je ne parle pas de l'API add_menu_page , je parle du menu WordPress par défaut.

Appel du fichier de menu

Le menu est évidemment chargé par wp-admin/admin.php . Mais il n'est pas chargé via l'API standard que nous avons l'habitude d'utiliser à partir de la documentation WordPress. L'ensemble du menu (toutes les options possibles, les sous-menus, etc.) est chargé via un simple tableau défini dans wp-admin/menu.php .

Donc, pour charger le système de menus, admin.php seulement require s menu.php ... autour de la ligne 99 dans WordPress 3.0.

Chargement du menu

Le menu lui-même est stocké dans le tableau global $menu . Selon la documentation en ligne, le tableau de menus contient les éléments suivants:

The elements in the array are:
    *     0: Menu item name
    *     1: Minimum level or capability required.
    *     2: The URL of the item's file
    *     3: Class
    *     4: ID
    *     5: Icon for top level menu

Le tableau de bord, par exemple, est:

$menu[2] = array( __('Dashboard'), 'read', 'index.php', '', 'menu-top menu-top-first menu-icon-dashboard', 'menu-dashboard', 'div' );

Le fichier parcourt et charge chaque élément de menu dans le tableau, puis tous leurs éléments de sous-menu dans un tableau appelé $submenu qui indexe en fonction de l'URL du menu parent. Ainsi, l'élément de sous-menu du tableau de bord appelé "Tableau de bord" est:

 $submenu[ 'index.php' ][0] = array( __('Dashboard'), 'read', 'index.php' );

Une fois que le système a terminé de charger tous les menus (il n'y en a pas beaucoup, mais le système parcourt l'index de temps en temps de 5 ou 10 ... remarquez que le tableau de bord, même s'il s'agit du premier élément de menu, est affiché. toujours indexé en tant qu’article "2" (les tableaux PHP commencent à l’indice 0 ... cela vous donne donc un peu de marge de manoeuvre).

À ce stade, le système appelle wp-admin/includes/menu.php .

Parcourir le menu

Ce troisième fichier parcourt chaque élément de menu et, en fonction des privilèges attribués à l'utilisateur actuel, utilise le menu ou le supprime. Tout d'abord, il parcourt tous les sous-menus et supprime les pages auxquelles l'utilisateur ne peut pas accéder. Ensuite, il parcourt les pages parent et fait la même chose. Ensuite, il supprime les séparateurs en double qui subsistent après l’élimination des menus.

Enfin, il trie les menus en fonction de leur ordre de menu.

Commande de menus personnalisés

Le crochet admin_menu est appelé après la configuration des menus mais avant , quoi que ce soit est commandé. Il est donc possible de commander l’ensemble du système de menus WordPress sans "pirater" l’API.

Une fois l'action admin_menu déclenchée, vos pages personnalisées sont chargées dans le système. Ensuite, WordPress vérifie un filtre appelé custom_menu_order ... Ce filtre est toujours renvoyé par false et indique à WordPress si vous souhaitez ou non utiliser une commande personnalisée.

Ajoutez les éléments suivants à votre thème pour définir l'indicateur sur true et définir votre ordre de menu explicite:

function custom_menu_order($menu_ord) {
       if (!$menu_ord) return true;
       return array('index.php', 'edit.php', 'edit-comments.php');
}

add_filter('custom_menu_order', 'custom_menu_order');
add_filter('menu_order', 'custom_menu_order');

Spécifiez l'ordre de votre choix pour tous les menus (j'ai fourni des références au fichier de chargement de menus afin que vous puissiez obtenir une liste de noms de fichiers) et ceci devrait en prendre soin.

EDIT (9/2/2010):

Pour spécifier l'ordre de l'écran d'édition d'un type d'article personnalisé à l'aide de cette méthode, vous devez connaître l'URL de l'écran d'édition. Dans la plupart des cas, ce sera http://blog.url/wp-admin/edit.php?post_type=POST_TYPE . Cela dépend de la manière dont WordPress est configuré sur votre site (s'il est installé à la racine ou dans un sous-dossier) et du slug du type de message personnalisé que vous utilisez.

Par exemple ...

Supposons que vous avez un type de publication personnalisé pour 'Stack Exchange Questions' et que vous souhaitez que l'éditeur apparaisse dans la même section que le tableau de bord directement sous son icône. Vous utiliseriez le code suivant dans le fichier functions.php de votre thème:

function custom_menu_order($menu_ord) {
       if (!$menu_ord) return true;
       return array('index.php', 'edit.php?post_type=stack_exchange_questions');
}

add_filter('custom_menu_order', 'custom_menu_order');
add_filter('menu_order', 'custom_menu_order');

Le reste du menu ne sera pas affecté, mais votre page de modification personnalisée sera déplacée vers la même section que le tableau de bord et apparaîtra juste en dessous. Vous pouvez utiliser cette option pour déplacer vos types de publication personnalisés vers n’importe quelle section du menu admin et les placer dans n’importe quel ordre. Vous pouvez également déplacer les éléments de menu standard de la même manière.

Assurez-vous simplement de spécifier l'ordre de tous les éléments de menu dans la section donnée , sinon votre menu pourrait être sujet à une bizarrerie inattendue.

    
réponse donnée EAMann 02.09.2010 - 03:22
la source
18

Je réalise que c’est un vieux sujet, mais je pense que cela vaut la peine d’être mis à jour avec une solution BEAUCOUP plus simple. Veuillez noter que cela fonctionne avec la version 3.5 et n’a été testé avec aucune autre version. Le code suivant peut être placé dans un plugin ou dans le fichier functions.php.

Voir: enlace . Modifié légèrement pour répondre aux besoins de l'affiche originale (j'espère cependant qu'il a trouvé une solution ...).

  // Rearrange the admin menu
  function custom_menu_order($menu_ord) {
    if (!$menu_ord) return true;
    return array(
      'index.php', // Dashboard
      'edit.php?post_type=custom_type_one', // Custom type one
      'edit.php?post_type=custom_type_two', // Custom type two
      'edit.php?post_type=custom_type_three', // Custom type three
      'edit.php?post_type=custom_type_four', // Custom type four
      'edit.php?post_type=custom_type_five', // Custom type five
      'separator1', // First separator
      'edit.php?post_type=page', // Pages
      'edit.php', // Posts
      'upload.php', // Media
      'link-manager.php', // Links
      'edit-comments.php', // Comments
      'separator2', // Second separator
      'themes.php', // Appearance
      'plugins.php', // Plugins
      'users.php', // Users
      'tools.php', // Tools
      'options-general.php', // Settings
      'separator-last', // Last separator
    );
  }

  add_filter('custom_menu_order', 'custom_menu_order'); // Activate custom_menu_order
  add_filter('menu_order', 'custom_menu_order');

Tous les éléments du menu administrateur qui ne sont pas répertoriés ici ne seront pas supprimés. Ils seront ajoutés au bas du menu.

    
réponse donnée Matt 20.12.2012 - 20:21
la source
2

Je comprends que vous ne voulez pas utiliser de plug-in, mais pour des raisons de simplicité, essayez le plug-in Admin Menu Editor de Janis Elsts. Réorganisez vos menus d'administration comme vous le souhaitez. peut également masquer des éléments de menu.

    
réponse donnée Ray Gulick 04.09.2010 - 19:53
la source
2

Pour déplacer les éléments de menu, j'aime bien utiliser la variable Global $menu .

Par exemple, si je souhaitais déplacer le menu "Pages" au bas des menus, je l’utiliserais dans functions.php ou dans un plugin:

function admin_menu_items() {
    global $menu;
    $menu[102]=$menu[20];//make menu 102 be the same as menu 20 (pages)
    $menu[20]=array();//make original pages menu disappear

}
add_action('admin_menu', 'admin_menu_items');

et si je voulais échanger les menus Articles et Liens:

function admin_menu_items() {
    global $menu;
    $storemenu = $menu[15];//save links menu into $storemenu
    $menu[15] = $menu[5];//make links menu = posts menu
    $menu[5] = $storemenu; //make menu 5/posts = $storemenu/links   
}
add_action('admin_menu', 'admin_menu_items');

Vous utilisez cette astuce depuis un moment, juste testé avec WP 3.4.1

    
réponse donnée forlogos 08.11.2012 - 21:58
la source
0

Génial. Merci beaucoup. Je viens de mettre quelques lignes de code dans mon functions.php

require_once('/extras/wp-admin-menu-classes.php');
add_action('admin_menu','my_admin_menu');
function my_admin_menu() {
  swap_admin_menu_sections('Pages','Posts'); // Swop location of Posts Section with Pages Section
}

Placer le wp-admin-menu-classes.php dans mon dossier de thèmes, le bouton "posts" est alors échangé avec le bouton 'pages'.

J'espère que cela fera bientôt partie du noyau et que nous n'aurons pas besoin d'écrire tout le menu d'une fonction pour réorganiser deux boutons.

En fait, il était un peu difficile d'obtenir un ordre plus précis pour 4 boutons. Afin de changer les 4 boutons en: Pages, Publier, Média, Liens Je devais utiliser le code suivant:

  swap_admin_menu_sections('Pages','Posts');                
  swap_admin_menu_sections('Media','Links');                 
  swap_admin_menu_sections('Posts','Links');
    
réponse donnée Sebastian 05.03.2012 - 06:36
la source

Lire d'autres questions sur les étiquettes