Voici un exemple;
Tout d'abord pour comprendre l'ordre des éléments du sous-menu en fonction de sa clé de tableau, vous pouvez faire un var_dump
sur la variable globale $ submenu qui produira ce qui suit;
(J'utilise le menu et le sous-menu Messages comme exemple)
//shortened for brevity....
["edit.php"]=>
array(6) {
[5]=>
array(3) {
[0]=> string(9) "All Posts"
[1]=> string(10) "edit_posts"
[2]=> string(8) "edit.php"
}
[10]=>
array(3) {
[0]=> string(7) "Add New"
[1]=> string(10) "edit_posts"
[2]=> string(12) "post-new.php"
}
[15]=>
array(3) {
[0]=> string(10) "Categories"
[1]=> string(17) "manage_categories"
[2]=> string(31) "edit-tags.php?taxonomy=category"
}
[17]=>
array(3) {
[0]=> string(14) "Sub Menu Title"
[1]=> string(10) "edit_posts"
[2]=> string(17) "sub_menu_page.php"
}
}
Nous pouvons voir que mon élément de sous-menu est ajouté dans le tableau avec une clé de 17 après les éléments par défaut.
Si, par exemple, je veux ajouter mon élément de sous-menu, directement après l' élément de sous-menu Tous les messages , je dois le faire en définissant ma clé de tableau sur 6, 7, 8 ou 9 (n'importe quoi après 5 et avant 10 respectivement.
Voici comment vous le faites ...
function change_submenu_order() {
global $menu;
global $submenu;
//set our new key
$new_key['edit.php'][6] = $submenu['edit.php'][17];
//unset the old key
unset($submenu['edit.php'][17]);
//get our new key back into the array
$submenu['edit.php'][6] = $new_key['edit.php'][6];
//sort the array - important! If you don't the key will be appended
//to the end of $submenu['edit.php'] array. We don't want that, we
//our keys to be in descending order
ksort($submenu['edit.php']);
}
Résultat,
["edit.php"]=>
array(6) {
[5]=>
array(3) {
[0]=> string(9) "All Posts"
[1]=> string(10) "edit_posts"
[2]=> string(8) "edit.php"
}
[6]=>
array(3) {
[0]=> string(14) "Sub Menu Title"
[1]=> string(10) "edit_posts"
[2]=> string(17) "sub_menu_page.php"
}
[10]=>
array(3) {
[0]=> string(7) "Add New"
[1]=> string(10) "edit_posts"
[2]=> string(12) "post-new.php"
}
[15]=>
array(3) {
[0]=> string(10) "Categories"
[1]=> string(17) "manage_categories"
[2]=> string(31) "edit-tags.php?taxonomy=category"
}
}
... essayez-le et dites-nous comment vous allez!
Mise à jour 1:
Ajoutez ceci à votre fichier functions.php;
function change_post_menu_label() {
global $menu;
global $submenu;
$my_menu = 'example_page'; //set submenu page via its ID
$location = 1; //set the position (1 = first item etc)
$target_menu = 'edit.php'; //the menu we are adding our item to
/* ----- do not edit below this line ----- */
//check if our desired location is already used by another submenu item
//if TRUE add 1 to our value so menu items don't clash and override each other
$existing_key = array_keys( $submenu[$target_menu] );
if ($existing_key = $location)
$location = $location + 1;
$key = false;
foreach ( $submenu[$target_menu] as $index => $values ){
$key = array_search( $my_menu, $values );
if ( false !== $key ){
$key = $index;
break;
}
}
$new['edit.php'][$location] = $submenu[$target_menu][$key];
unset($submenu[$target_menu][$key]);
$submenu[$target_menu][$location] = $new[$target_menu][$location];
ksort($submenu[$target_menu]);
}
Ma mise à jour comprend un moyen un peu plus simple de gérer le réglage de la position de votre menu, il vous suffit de préciser le nom de votre page de sous-menu et la position que vous souhaitez dans le menu. Cependant, si vous sélectionnez une page de sous-menu $location
égale à celle d'une clé existante, elle remplacera cette clé par la vôtre, ainsi l'élément de menu disparaîtra avec votre élément de menu à sa place. Augmentez ou décrémentez le nombre pour commander correctement votre menu si tel est le cas. De même, si quelqu'un installe un plugin qui affecte la même zone de menu et qui a le même $location
que votre élément de sous-menu, le même problème se produira. Pour contourner cela, l'exemple de Kaiser fournit une vérification de base pour cela.
Mise à jour 2:
J'ai ajouté un bloc de code supplémentaire qui vérifie toutes les clés existantes dans le tableau par rapport à nos souhaits $location
et si une correspondance est trouvée, nous augmenterons notre $location
valeur 1
afin d'éviter que les éléments de menu ne se remplacent. Ceci est le code responsable de cela,
//excerpted snippet only for example purposes (found in original code above)
$existing_key = array_keys( $submenu[$target_menu] );
if ($existing_key = $location)
$location = $location + 1;
Mise à jour 3: (script révisé pour permettre le tri de plusieurs éléments de sous-menu)
add_action('admin_init', 'move_theme_options_label', 999);
function move_theme_options_label() {
global $menu;
global $submenu;
$target_menu = array(
'themes.php' => array(
array('id' => 'optionsframework', 'pos' => 2),
array('id' => 'bp-tpack-options', 'pos' => 4),
array('id' => 'multiple_sidebars', 'pos' => 3),
)
);
$key = false;
foreach ( $target_menu as $menus => $atts ){
foreach ($atts as $att){
foreach ($submenu[$menus] as $index => $value){
$current = $index;
if(array_search( $att['id'], $value)){
$key = $current;
}
while (array_key_exists($att['pos'], $submenu[$menus]))
$att['pos'] = $att['pos'] + 1;
if ( false !== $key ){
if (array_key_exists($key, $submenu[$menus])){
$new[$menus][$key] = $submenu[$menus][$key];
unset($submenu[$menus][$key]);
$submenu[$menus][$att['pos']] = $new[$menus][$key];
}
}
}
}
}
ksort($submenu[$menus]);
return $submenu;
}
Dans l'exemple ci-dessus, vous pouvez cibler plusieurs sous-menus et plusieurs éléments par sous-menu en définissant les paramètres en conséquence dans la $target_menu
variable qui contient un tableau multidimensionnel de valeurs.
$target_menu = array(
//menu to target (e.g. appearance menu)
'themes.php' => array(
//id of menu item you want to target followed by the position you want in sub menu
array('id' => 'optionsframework', 'pos' => 2),
//id of menu item you want to target followed by the position you want in sub menu
array('id' => 'bp-tpack-options', 'pos' => 3),
//id of menu item you want to target followed by the position you want in sub menu
array('id' => 'multiple_sidebars', 'pos' => 4),
)
//etc....
);
Cette révision empêchera les éléments de sous-menu de se remplacer les uns les autres s'ils ont la même clé (position), car elle passera en revue jusqu'à ce qu'elle trouve une clé (position) disponible qui n'existe pas.