นี่คือตัวอย่าง;
ก่อนอื่นให้คิดลำดับของรายการเมนูย่อยตามคีย์อาร์เรย์ของมันคุณสามารถทำvar_dump
ตัวแปรโกลบอล $ submenu ซึ่งจะแสดงผลลัพธ์ต่อไปนี้
(ฉันใช้เมนูโพสต์และเมนูย่อยเป็นตัวอย่าง)
//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:
เพิ่มไฟล์นี้ลงในไฟล์ 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]);
}
การอัปเดตของฉันมีวิธีที่ง่ายกว่าเล็กน้อยในการจัดการการตั้งค่าตำแหน่งเมนูของคุณคุณต้องระบุชื่อของหน้าเมนูย่อยและตำแหน่งที่คุณต้องการภายในเมนูเท่านั้น อย่างไรก็ตามหากคุณเลือกหน้าเมนูย่อย$location
เท่ากับของคีย์ที่มีอยู่หน้านั้นจะแทนที่คีย์นั้นกับคุณดังนั้นรายการเมนูจะหายไปพร้อมกับรายการเมนูของคุณ เพิ่มหรือลดจำนวนเพื่อสั่งเมนูของคุณอย่างถูกต้องหากเป็นกรณีนี้ คล้ายกันถ้ามีคนติดตั้งปลั๊กอินที่มีผลต่อพื้นที่เมนูเดียวกันและสิ่งที่มีเหมือน$location
รายการเมนูย่อยของคุณปัญหาเดียวกันจะเกิดขึ้น เพื่อหลีกเลี่ยงสิ่งนั้นตัวอย่างของ Kaiser มีการตรวจสอบเบื้องต้นบางอย่าง
อัปเดต 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....
);
การแก้ไขนี้จะป้องกันรายการเมนูย่อยที่เขียนทับกันหากพวกเขามีคีย์เดียวกัน (ตำแหน่ง) เนื่องจากมันจะวนไปมาจนกว่าจะพบคีย์ที่มีอยู่ (ตำแหน่ง) ที่ไม่มีอยู่