Đây là một ví dụ;
Đầu tiên để tìm ra thứ tự của các mục menu phụ dựa trên khóa mảng của nó, bạn có thể thực hiện một var_dump
biến toàn cầu $ submenu sẽ xuất ra như sau;
(Tôi đang sử dụng menu Bài viết và menu phụ làm ví dụ)
//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"
}
}
Chúng ta có thể thấy rằng mục menu phụ của tôi được thêm vào mảng với khóa 17 sau các mục mặc định.
Ví dụ: nếu tôi muốn thêm mục menu phụ của mình, ngay sau mục menu phụ Tất cả bài viết tôi cần thực hiện bằng cách đặt khóa mảng của mình thành 6, 7, 8 hoặc 9 (bất cứ điều gì sau 5 và trước 10 tương ứng.
Đây là cách bạn làm điều đó...
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']);
}
Kết quả,
["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"
}
}
... hãy thử và cho chúng tôi biết bạn đi như thế nào!
Cập nhật 1:
Thêm phần này vào tập tin tests.php của bạn;
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]);
}
Cập nhật của tôi bao gồm một cách dễ dàng hơn một chút để xử lý cài đặt vị trí menu của bạn, bạn chỉ cần quy định tên của trang menu con và vị trí bạn muốn trong menu. Tuy nhiên, nếu bạn chọn một trang menu con $location
bằng với khóa hiện có, nó sẽ ghi đè khóa đó bằng khóa của bạn, do đó mục menu sẽ biến mất cùng với mục menu của bạn. Tăng hoặc giảm số để sắp xếp chính xác menu của bạn nếu đó là trường hợp. Tương tự, nếu ai đó cài đặt một plugin có ảnh hưởng đến cùng khu vực menu đó và đối với $location
mục menu con của bạn thì vấn đề tương tự sẽ xảy ra. Để phá vỡ điều đó, ví dụ của Kaiser cung cấp một số kiểm tra cơ bản cho điều đó.
Cập nhật 2:
Tôi đã thêm một khối mã bổ sung để kiểm tra tất cả các khóa hiện có trong mảng so với mong muốn của chúng tôi $location
và nếu tìm thấy kết quả khớp, chúng tôi sẽ tăng $location
giá trị của chúng tôi 1
để tránh các mục menu ghi đè lên nhau. Đây là mã chịu trách nhiệm cho điều đó,
//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;
Cập nhật 3: (tập lệnh được sửa đổi để cho phép sắp xếp nhiều mục menu phụ)
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;
}
Trong ví dụ trên, bạn có thể nhắm mục tiêu nhiều menu phụ và nhiều mục trên mỗi menu phụ bằng cách đặt các tham số phù hợp trong $target_menu
biến chứa một mảng các giá trị đa chiều.
$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....
);
Bản sửa đổi này sẽ ngăn các mục menu phụ ghi đè lên nhau nếu chúng có cùng khóa (vị trí), vì nó sẽ quay vòng cho đến khi tìm thấy khóa (vị trí) có sẵn không tồn tại.