Ecco un esempio;
Per prima cosa, per capire l'ordine delle voci del sottomenu in base alla sua chiave di matrice, è possibile eseguire una var_dump
variabile globale del sottomenu $ che genererà quanto segue;
(Sto usando il menu Messaggi e il sottomenu come esempio)
//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"
}
}
Possiamo vedere che la mia voce di sottomenu viene aggiunta alla matrice con una chiave di 17 dopo le voci predefinite.
Se ad esempio voglio aggiungere la mia voce di sottomenu, subito dopo la voce di sottomenu Tutti i messaggi, devo farlo impostando la mia chiave di array su 6, 7, 8 o 9 (rispettivamente dopo 5 e prima di 10.
Ecco come lo fai ...
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']);
}
Risultato,
["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"
}
}
... provalo e facci sapere come vai!
Aggiornamento 1:
Aggiungi questo al tuo file 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]);
}
Il mio aggiornamento include un modo leggermente più semplice per gestire l'impostazione della posizione del menu, è necessario solo specificare il nome della pagina del sottomenu e la posizione desiderata all'interno del menu. Tuttavia, se si seleziona una pagina del sottomenu $location
uguale a quella di una chiave esistente, sostituirà quella chiave con la propria, quindi la voce di menu scomparirà con la voce di menu al suo posto. Incrementa o decrementa il numero per ordinare correttamente il tuo menu, se questo è il caso. Allo stesso modo, se qualcuno installa un plugin che ha effetto sulla stessa area di menu e per il quale ha lo stesso $location
elemento del sottomenu, si verificherà lo stesso problema. Per aggirare ciò, l'esempio di Kaiser fornisce alcuni controlli di base per questo.
Aggiornamento 2:
Ho aggiunto un ulteriore blocco di codice che controlla tutte le chiavi esistenti nell'array rispetto alle nostre desiderate $location
e se viene trovata una corrispondenza, aumenteremo il nostro $location
valore 1
per evitare che le voci di menu si sovrappongano. Questo è il codice responsabile di ciò,
//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;
Aggiornamento 3: (script rivisto per consentire l'ordinamento di più voci di sottomenu)
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;
}
Nell'esempio sopra puoi scegliere come target più sottomenu e più voci per sottomenu impostando i parametri di conseguenza all'interno della $target_menu
variabile che contiene un array multidimensionale di valori.
$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....
);
Questa revisione eviterà che le voci dei sottomenu si sovrascrivano reciprocamente se hanno la stessa chiave (posizione), poiché scorrerà fino a trovare una chiave (posizione) disponibile che non esiste.