Changer l'ordre des sections du menu Admin?

31

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

Essentiellement, j'ai 5 types de messages personnalisés que j'ai créés et tout ce que je veux faire est de montrer chacun d'eux 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 de 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 admin exactement comme je le souhaite en utilisant le fichier de fonctions et sans utiliser de plugin (dont je sais qu'il 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. ?? ... y a-t-il un type de piratage jquery pour faire fonctionner cela pourrait partager avec moi ou de préférence sans utiliser jQuery?

Binarybit
la source

Réponses:

33

Salut @BinaryBit:

Il n'est pas étonnant que vous soyez un peu frustré; le menu d'administration est l'une des implémentations les plus obtus et les plus frustrantes de WordPress core. Honnêtement, je ne sais pas ce qu'ils pensaient quand ils l'ont conçu de cette façon.

@EAMann a fait un excellent travail pour expliquer comment les menus d'administration fonctionnent dans WordPress (j'aurais aimé pouvoir le lire il y a environ 4 mois ... :)

Pourtant, après avoir compris comment cela fonctionnait, j'étais toujours à court de travailler avec elle sans consacrer suffisamment de temps à garder la tête droite pendant que j'essayais de faire des choses simples. C'est pourquoi j'ai construit une API de menu qui simplifie et rationalise le travail avec le menu d'administration WordPress.

Ils sont 100% compatibles avec les structures existantes de WordPress et toujours très bien en alpha depuis que 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 vous pouvez appeler les fonctions dans le functions.phpfichier 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!

Mike Schinkel
la source
Ajout fantastique à l'API! Il m'a fallu des mois pour ajouter ma première section de menu personnalisé avec le framework existant (c'est pourquoi j'ai beaucoup étudié le code) ... mais votre API semble beaucoup plus intuitive à utiliser!
EAMann
@EAMann - Merci! Si vous souhaitez offrir des suggestions ou même collaborer à son amélioration, j'aimerais que quelque chose soit établi qui pourrait le rendre plus facile pour tout le monde, à l'exception de quelques-uns qui voient cette Q&R.
MikeSchinkel
est-ce que cela a fait du noyau ou est-ce que ceci ou quelque chose de similaire est encore nécessaire pour manipuler l'ordre des éléments de menu dans l'administrateur?
Q Studio
Pour autant que j'ai trouvé, il a été reporté à WP 3.5
pixeline
Hey Mike - wp_debug renvoie une erreur sur cette fonction: -------- fonction swap_admin_menu_sections ($ from_section, $ to_section) {$ from_section = get_admin_menu_section ($ from_section); if ($ from_section) $ from_section-> swap_with ($ to_section); retourner la section $; } --- Remarque: Variable non définie: section
Q Studio
21

Voici une présentation rapide de la façon dont le menu d'administration WordPress est construit - je ne parle pas de l' add_menu_pageAPI, je veux dire le menu WordPress par défaut réel.

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 sur la base de la documentation WordPress. Au contraire, l'ensemble du menu (toutes les options possibles, sous-menus, etc.) est chargé via un tableau simple défini dans wp-admin/menu.php.

Donc, pour charger le système de menus, il admin.phpsuffit de 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 comprend 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 et charge tous leurs éléments de sous-menu dans un tableau appelé $submenuindex en fonction de l'URL du menu parent. Ainsi, l'élément de sous-menu du tableau de bord appelé "Dashboard" 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 au moment de 5 ou 10 ... notez que le tableau de bord, même s'il s'agit du premier élément de menu, est toujours indexé comme item "2" (les tableaux PHP commencent à l'index 0 ... donc cela vous donne une certaine marge de manœuvre).

À 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 tous les séparateurs en double qui restent après avoir supprimé les menus.

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

Commande de menus personnalisés

Le hook admin_menuest appelé après la configuration des menus mais avant toute commande. Il est donc possible de commander l'intégralité du système de menus WordPress sans "pirater" l'API.

Une fois l'action admin_menudéclenchée, vos pages personnalisées sont chargées dans le système. La prochaine chose qui se passe, c'est que WordPress vérifie un filtre appelé custom_menu_order... ce filtre est toujours renvoyé falseet indique à WordPress si vous souhaitez ou non utiliser une commande personnalisée.

Ajoutez ce qui suit à votre thème pour définir le drapeau à la trueplace 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 menu afin que vous puissiez obtenir une liste de noms de fichiers) et cela devrait s'en occuper.


EDIT (9/2/2010):

Pour spécifier l'ordre de l'écran d'édition d'un type de publication 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 le cas http://blog.url/wp-admin/edit.php?post_type=POST_TYPE. Cela dépend de la configuration de WordPress sur votre site (s'il est installé à la racine ou dans un sous-dossier) et du slug du type de publication personnalisé que vous utilisez.

Par exemple...

Supposons que vous ayez un type de publication personnalisé pour «Stack Exchange Questions» 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 functions.phpfichier 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 d'édition personnalisée sera déplacée vers la même section que le tableau de bord et apparaîtra immédiatement en dessous. Vous pouvez l'utiliser pour déplacer vos types de publication personnalisés vers n'importe quelle section du menu d'administration 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.

EAMann
la source
Il y a une petite erreur dans votre exemple de code sous l'en-tête "Commande de menus personnalisés", si l'instruction conditionnelle manque le $sur le nom de la variable ... (Excellente réponse cependant) ..
t31os
Comment ajouteriez-vous le type de publication personnalisé pour «Questions d'échange de pile» à une section sous la section Tableau de bord?
epaps
Salut EAMann - question rapide. Depuis la dernière version de wordpress, ce processus a-t-il changé ou est-il devenu plus simple?
NetConstructor.com
Que diriez - vous de sous - menus ? Existe-t-il une méthode similaire pour réorganiser les éléments du sous - menu ?
Giraldi
@GiraldiMaggio Veuillez poser une nouvelle question et faire référence à celle-ci.
EAMann
18

Je me rends compte que c'est un vieux fil, mais je pense qu'il vaut la peine d'être mis à jour avec une solution BEAUCOUP plus facile. Veuillez noter que cela fonctionne avec 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 (cependant, j'espère 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');

Tous les éléments du menu d'administration qui ne sont pas répertoriés ici ne seront pas supprimés. Ils seront ajoutés en bas du menu.

Mat
la source
1
Oui, c'est beaucoup mieux, également pour réorganiser les éléments de sous-menu, vous pouvez les désactiver puis les réinitialiser.
Wyck
2

Je comprends que vous ne voulez pas utiliser de plugin, mais pour plus de simplicité, essayez le plugin Admin Menu Editor de Janis Elsts. Réorganisez vos menus d'administration comme bon vous semble; peut également masquer les éléments de menu.

Ray Gulick
la source
J'ai essayé ce plugin dans une installation multisite.Il fonctionne mieux.Mais nous devons configurer manuellement les options pour chaque sous-site si nous avons une installation multisite.
user391
2

Pour déplacer des éléments de menu, j'aime utiliser la $menuvariable Global .

Par exemple, si je voulais déplacer le menu "Pages" en bas des menus, j'utiliserais ceci dans functions.phpou 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 Messages 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 petit moment, je viens de la tester avec WP 3.4.1

forlogos
la source
Je sais que c'est un article plus ancien mais en ce qui concerne votre premier extrait, j'ai rencontré un problème avec la dernière ligne de la admin_menu_itemsfonction qui a été corrigée en la remplaçant parunset($menu[20]);
hot_barbara
0

Impressionnant. Merci beaucoup. Je viens de mettre quelques lignes de code dans mes fonctions.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 le wp-admin-menu-classes.php dans mon dossier de thème et maintenant le bouton «posts» est remplacé par le bouton «pages».

J'espère que cela fera bientôt partie du noyau de manière à ce que nous n'ayons pas besoin d'écrire tout le menu dans une fonction pour simplement 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, Post, Media, Links, j'avais besoin d'utiliser le code suivant:

  swap_admin_menu_sections('Pages','Posts');                
  swap_admin_menu_sections('Media','Links');                 
  swap_admin_menu_sections('Posts','Links');
Sebastian
la source