Ось приклад;
Спочатку з’ясуйте порядок елементів підменю на основі його клавіші масиву, ви можете зробити a var_dump
у глобальній змінній $ підменю $, яка виведе наступне;
(Я використовую меню "Публікації" та підменю як приклад)
//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"
}
}
Ми бачимо, що мій елемент підменю додається до масиву з ключем 17 після елементів за замовчуванням.
Якщо, наприклад, я хочу додати свій пункт підменю, безпосередньо після пункту підменю « Усі повідомлення », мені потрібно зробити це, встановивши мою клавішу масиву на 6, 7, 8 або 9 (будь-що після 5 і до 10 відповідно.
Ось як ви це робите ...
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']);
}
Результат,
["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"
}
}
... спробуйте і дайте нам знати, як ви йдете!
Оновлення 1:
Додайте це до файлу function.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]);
}
Моє оновлення включає дещо простіший спосіб керувати налаштуваннями вашого меню, потрібно лише вказати назву сторінки підменю та потрібну позицію в меню. Однак якщо ви вибрали сторінку підменю, що $location
дорівнює наявній клавіші, вона замінить цей ключ із вашою, таким чином пункт меню зникне, коли пункт меню замість нього. Збільшення або зменшення номера, щоб правильно впорядкувати своє меню, якщо це так. Аналогічно, якщо хтось встановить плагін, який впливає на ту саму область меню, і для якої він такий самий, $location
як і у вашому підменю, тоді виникне та сама проблема. Щоб обійти це, приклад Кайзера дає деякі основні перевірки на це.
Оновлення 2:
Я додав додатковий блок коду, який перевіряє всі наявні ключі в масиві на відповідність бажаному, $location
і якщо буде знайдено відповідність, ми збільшимо своє $location
значення 1
, щоб уникнути перекриття елементів меню. Це код, відповідальний за це,
//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;
Оновлення 3: (сценарій переглянуто, щоб дозволити сортування декількох елементів підменю)
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;
}
У наведеному вище прикладі ви можете орієнтуватися на кілька підменю та кілька елементів на підменю, встановивши параметри відповідно у $target_menu
змінній, що містить багатовимірний масив значень.
$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....
);
Ця редакція дозволить запобігти перезаписуванню елементів підменю, якщо вони мають однакову клавішу (позицію), оскільки вона буде переходити до тих пір, поки не знайде доступний ключ (позицію), який не існує.