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