web-dev-qa-db-fra.com

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

Après avoir lu ailleurs sur la pile de deux WP plugins forçant des positions de menu identiques (avec la probabilité qu’un n’apparaisse pas alors), 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 par défaut (articles, pages, thèmes, plug-ins, paramètres, etc.) - de premier niveau - mais qui ne modifie pas le positionnement de ces éléments ajoutés par les 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 il serait agréable de les réorganiser en conséquence, ainsi que de pouvoir mieux réorganiser les éléments. qui ne force pas une position de menu et apparaît à la place.

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éapprovisionnement 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 ils sont scindés lorsque la fonction est réactivée. par ContactForm7 ('admin.php? page = wpcf7').

Et 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 soit.

7
glvr

Pour modifier l'ordre des éléments du menu d'administration de niveau supérieur, vous aurez besoin de deux variables hooks, deux filters et une function. Placez le code suivant dans le functions.php de votre thème actuel:

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 core, 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 deux plugins ajoutés et activés (par exemple: Wordfence et NextCellent Gallery). Nous devons d'abord trouver les noms de ces éléments de menu. Lorsque nous cliquons sur l'élément de menu de niveau supérieur de Wordfence, l'URL résultante se termine par ?page=Wordfence. La partie après ?page= est notre nom (Wordfence). Pour NextCellent Gallery, le nom sera nextcellent-gallery-nextgen-legacy. Ajoutons maintenant 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 les éléments de ce tableau, de haut en bas, pour obtenir la commande finale.

Remarque : vous pouvez utiliser Editeur de menu Admin plugin, pour faciliter les actions de glisser-déposer.

6

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

menu_position (integer) (facultatif) La position dans l'ordre du menu dans laquelle le type de publication 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 modifier la position de menu d'un plug-in que vous n'avez pas créé, beaucoup d'entre eux l'ont peut-être branché ou vous pouvez modifier leurs appels.

5
rudtek

Les réponses existantes conviennent, mais si vous ajoutez 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_positions dans la fonction my_new_menu_order:

/**
 * 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;
};
5
rassoh