web-dev-qa-db-fra.com

Changer l’ordre des sections du menu Admin?

Je commence à être 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" .

Dans 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 au dessus de L

Je suppose qu'un expert en lecture peut me montrer de manière simple que je peux commander le menu d'administration exactement comme je le souhaite, en utilisant le fichier de fonctions et sans utiliser de plug-in (qui, je le sais, existe).

Allez-y et 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 hack jquery permettant de faire ce travail pourrait partager avec moi ou de préférence sans utiliser jQuery?

31
Binarybit

Hi @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 du noyau WordPress. Honnêtement, je ne sais pas à quoi ils pensaient quand ils l’ont conçu de cette façon.

(@EAMann} _ a fait unexcellenttravail expliquant comment les menus de l'administrateur fonctionnent dans WordPress (j'aurais aimé pouvoir le lire il y a environ 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 construit 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 restent 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 peut 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) à inclure dans WordPress 3.1 donc si nous avons de la chance, elles pourraient même devenir standard!

33
MikeSchinkel

Voici un rapide aperçu de la construction du menu d'administration 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 utilisons habituellement à partir de la documentation WordPress. L'ensemble du menu (toutes les options possibles, les sous-menus, etc.) est chargé via un tableau simple défini dans wp-admin/menu.php.

Donc, pour charger le système de menus, admin.php juste requires 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 les éléments de sous-menu dans un tableau appelé $submenu, indexé 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 à 10 ... remarquez que le tableau de bord, même s’il s’agit du premier élément de menu, est toujours indexé de la manière suivante: item "2" (les tableaux PHP commencent à l'index 0 ... donc cela vous laisse 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 restent après l’élimination des menus.

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

Commande de menus personnalisés

Le hook admin_menu est appelé après la configuration des menus mais avant tout est commandé. Il est donc possible de commander l'intégralité 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é false et indique à WordPress si vous souhaitez ou non utiliser un ordre personnalisé.

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 que vous souhaitez 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 (02/09/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 ayez un type de publication personnalisé pour "Questions d'échange Stack" et que vous souhaitiez que l'éditeur apparaisse dans la même section que le tableau de bord directement sous l'icône du tableau de bord. 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.

21
EAMann

Je réalise que c'est un vieux fil, mais je pense que ça vaut la peine de le mettre à jour avec une solution BEAUCOUP plus facile. 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: http://codex.wordpress.org/Plugin_API/Filter_Reference/menu_order . Modifié légèrement pour répondre aux besoins de l'affiche originale (j'espère cependant qu'il a trouvé une solution maintenant ...).

  // 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');

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.

18
Matt

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

Par exemple, si je voulais 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');

J'utilise cette astuce depuis un moment, juste testé avec WP 3.4.1

2
forlogos

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.

2
Ray Gulick

Impressionnant. 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
}

De plus, en plaçant wp-admin-menu-classes.php dans mon dossier de thèmes, le bouton "posts" est é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');
0
Sebastian