Comment puis-je contrôler la position dans le menu d'administration des éléments ajoutés par les plugins?

8

Après avoir lu ailleurs sur la pile de deux plugins WP forçant des positions de menu identiques (avec la probabilité qu'un n'apparaisse pas), je me demande comment je peux contrôler la position des éléments de menu ajoutés par les plugins.

J'utilise déjà une fonction qui semble gérer de tels éléments de sous-menu dans les `` paramètres '', et une autre fonction pour réorganiser les éléments de haut niveau par défaut (publications, pages, thèmes, plugins, paramètres, etc.), mais qui ne change pas le positionnement de ces éléments ajoutés par des plugins.

function custom_menu_order() {
return array(
//Add items here in desired order.

);
}

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

Par exemple, parmi les deux éléments de menu de niveau supérieur ajoutés par WooCommerce, l'un apparaît au-dessus de l'élément ajouté par ContactForm7 et l'autre ci-dessous, et ce serait bien de les réorganiser en conséquence - et aussi, pour pouvoir mieux réorganiser les éléments qui ne forcent pas une position de menu et apparaissent à la place en bas.

Je trouve que cela fonctionne généralement bien pour réorganiser les éléments par défaut et 'edit.php? Post_type = ...', mais ceux avec 'admin.php? Page = ...' ne réorganisent pas.

Lorsque ma fonction de réorganisation est désactivée, les deux éléments WooCommerce ('edit.php? Post_type = product' et 'edit.php? Post_type = shop_order') se regroupent comme prévu, mais lorsque la fonction est réactivée, ils sont divisés par ContactForm7 ('admin.php? page = wpcf7').

Et l'un ('edit.php? Post_type = shop_order') des CPT WooCommerce ne sera pas réorganisé - bien que l'autre ('edit.php? Post_type = product') le fasse.

glvr
la source

Réponses:

8

Pour modifier l'ordre des éléments du menu administrateur de niveau supérieur, vous en aurez besoin de deux hooks, deux filterset un function. Mettez le code suivant dans votre thème actuel functions.php:

function wpse_custom_menu_order( $menu_ord ) {
    if ( !$menu_ord ) return true;

    return array(
        'index.php', // Dashboard
        'separator1', // First separator
        'edit.php', // Posts
        'upload.php', // Media
        'link-manager.php', // Links
        'edit-comments.php', // Comments
        'edit.php?post_type=page', // Pages
        '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', 'wpse_custom_menu_order', 10, 1 );
add_filter( 'menu_order', 'wpse_custom_menu_order', 10, 1 );

Le tableau renvoyé des éléments de menu d'administration de niveau supérieur, ci-dessus, représente les éléments de menu insérés par le noyau, dans leur ordre par défaut. Pour inclure les éléments de menu ajoutés par les plugins, nous devons les ajouter à ce tableau. Disons que nous avons ajouté et activé deux plugins (par exemple: Wordfenceet NextCellent Gallery). Nous devons d'abord trouver les noms de ces éléments de menu. Lorsque nous cliquons sur Wordfencel'élément de menu de niveau supérieur, l'URL résultante se termine par ?page=Wordfence. La partie après ?page=est notre nom ( Wordfence). Car NextCellent Gallery, le nom sera nextcellent-gallery-nextgen-legacy. Maintenant, ajoutons ces éléments à notre tableau:

return array(
    'index.php', // Dashboard
    'separator1', // First separator
    'edit.php', // Posts
    'upload.php', // Media
    'link-manager.php', // Links
    'edit-comments.php', // Comments
    'edit.php?post_type=page', // Pages
    'separator2', // Second separator
    'themes.php', // Appearance
    'plugins.php', // Plugins
    'users.php', // Users
    'tools.php', // Tools
    'separator3', // Third separator
    'options-general.php', // Settings
    'separator-last', // Last separator
    'Wordfence', // Wordfence
    'nextcellent-gallery-nextgen-legacy', // NextCellent Gallery
);

Nous pouvons, maintenant, déplacer des éléments de ce tableau, de haut en bas, pour obtenir la commande finale.

Remarque : vous pouvez également utiliser le plug-in Editeur du menu Admin pour des actions de glisser-déposer faciles.

Frank P. Walentynowicz
la source
1
@ Frank P. Walentynowicz ... merci pour la réponse complète. J'ai mis à jour mon message d'origine pour clarifier, et votre suggestion d'utiliser `` la partie après? Page = '' est très utile et résout mon problème - à l'exception de l'un des deux articles WooCommerce.
glvr
Ajout rapide à mon commentaire ci-dessus: j'avais déjà utilisé l'éditeur du menu Admin, mais je préfère une fonction codée en dur.
glvr
11

Les réponses existantes sont correctes, mais si vous ajoutiez un nouveau type de publication personnalisé, vous devrez rééditer ces fonctions encore et encore.

Pour résoudre ce problème, j'ai développé cette petite fonction. Définissez simplement votre $new_positionsintérieur de la my_new_menu_orderfonction:

/**
 * Activates the 'menu_order' filter and then hooks into 'menu_order'
 */
add_filter('custom_menu_order', function() { return true; });
add_filter('menu_order', 'my_new_admin_menu_order');
/**
 * Filters WordPress' default menu order
 */
function my_new_admin_menu_order( $menu_order ) {
  // define your new desired menu positions here
  // for example, move 'upload.php' to position #9 and built-in pages to position #1
  $new_positions = array(
    'upload.php' => 9,
    'edit.php?post_type=page' => 1
  );
  // helper function to move an element inside an array
  function move_element(&$array, $a, $b) {
    $out = array_splice($array, $a, 1);
    array_splice($array, $b, 0, $out);
  }
  // traverse through the new positions and move 
  // the items if found in the original menu_positions
  foreach( $new_positions as $value => $new_index ) {
    if( $current_index = array_search( $value, $menu_order ) ) {
      move_element($menu_order, $current_index, $new_index);
    }
  }
  return $menu_order;
};
rassoh
la source
1
C'est génial - donc lorsque de nouveaux éléments doivent être ajoutés en tant qu'élément de menu, comme un type de publication personnalisé (comme vous l'avez suggéré) ou un nouveau plugin ou même une nouvelle option intégrée à l'avenir, il sera ajouté très bien comme d'habitude ?
Brett
@Brett On dirait que cela fonctionnerait comme ça.
Davey
6

lorsque vous créez un type de publication avec register_post_type (), vous pouvez définir la position du menu:

menu_position (entier) (facultatif) La position dans l'ordre du menu, le type de message doit apparaître. show_in_menu doit être vrai.

    Default: null - defaults to below Comments 

    5 - below Posts
    10 - below Media
    15 - below Links
    20 - below Pages
    25 - below comments
    60 - below first separator
    65 - below Plugins
    70 - below Users
    75 - below Tools
    80 - below Settings
    100 - below second separator

Si les éléments ont la même position dans le menu, ils sont triés par ordre alphabétique.

dans votre propre plugin, vous pouvez définir le niveau. si vous essayez de changer la position de menu d'un plugin que vous n'avez pas créé, beaucoup d'entre eux peuvent l'avoir enfichable, ou vous pouvez modifier leurs appels.

Rudtek
la source
@ rudtek ... merci. Dans mes propres CPT, j'ai évité de définir des positions de menu, préférant plutôt utiliser une réorganisation de menu et ainsi «tout avoir au même endroit» et plus facile à changer par la suite. N'ayant pas de plugins pour lesquels j'essaie de définir la position du menu, c'est pour des plugins tiers - pour lesquels je ne connais pas assez le `` pluggable '' ou pour modifier leurs appels (qui seraient vraisemblablement écrasés lors de la mise à jour).
glvr