Oto przykład;
Najpierw ustal kolejność elementów podmenu na podstawie klucza tablicy, którą możesz wykonać var_dump
globalnej zmiennej podmenu $, która wyświetli następujące;
(Korzystam z menu Postów i podmenu jako przykładu)
//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"
}
}
Widzimy, że mój element podmenu jest dodawany do tablicy za pomocą klucza 17 po elementach domyślnych.
Jeśli na przykład chcę dodać element podmenu, bezpośrednio po Wszystkich postach elemencie podmenu muszę to zrobić, ustawiając klawisz tablicy na 6, 7, 8 lub 9 (odpowiednio po 5 i przed 10).
Tak to się robi...
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']);
}
Wynik,
["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"
}
}
... spróbuj i daj nam znać, jak idziesz!
Aktualizacja 1:
Dodaj to do pliku 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]);
}
Moja aktualizacja zawiera nieco łatwiejszy sposób obsługi ustawień pozycji menu, wystarczy podać nazwę strony podmenu i żądaną pozycję w menu. Jeśli jednak wybierzesz stronę podmenu $location
równą stronie istniejącego klucza, zastąpi on ten klucz twoją, dlatego element menu zniknie, a element menu zostanie zastąpiony. W takim przypadku zwiększ lub zmniejsz numer, aby poprawnie zamówić menu. Podobnie, jeśli ktoś zainstaluje wtyczkę, która działa na ten sam obszar menu i dla którego ma to samo, $location
co element podmenu, wystąpi ten sam problem. Aby to obejść, przykład Kaisera zapewnia podstawowe sprawdzenie tego.
Aktualizacja 2:
Dodałem dodatkowy blok kodu, który sprawdza wszystkie istniejące klucze w tablicy względem naszych pożądanych, $location
a jeśli zostanie znalezione dopasowanie, zwiększymy naszą $location
wartość 1
, aby uniknąć wzajemnego zastępowania się elementów menu. To jest kod odpowiedzialny za to,
//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;
Aktualizacja 3: (poprawiono skrypt, aby umożliwić sortowanie wielu pozycji podmenu)
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;
}
W powyższym przykładzie możesz kierować reklamy na wiele podmenu i wiele pozycji na podmenu, ustawiając odpowiednio parametry w $target_menu
zmiennej, która zawiera wielowymiarową tablicę wartości.
$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....
);
Ta poprawka zapobiegnie wzajemnemu nadpisywaniu się elementów podmenu, jeśli mają one ten sam klucz (pozycję), ponieważ będzie on przechodził, aż znajdzie dostępny klucz (pozycja), który nie istnieje.