Hier ist ein Beispiel;
Um zunächst die Reihenfolge der Untermenüelemente anhand des Array-Schlüssels zu ermitteln, können Sie eine Anweisung für die var_dump
globale Variable $ submenu ausführen, die Folgendes ausgibt:
(Ich verwende das Menü Beiträge und das Untermenü als Beispiel)
//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"
}
}
Wir können sehen, dass mein Untermenüelement mit einem Schlüssel von 17 nach den Standardelementen zum Array hinzugefügt wird.
Wenn ich zum Beispiel meinen Untermenüpunkt hinzufügen möchte, muss ich dies direkt nach dem Untermenüpunkt Alle Beiträge tun, indem ich meinen Array-Schlüssel auf 6, 7, 8 oder 9 setze (alles nach 5 bzw. vor 10).
Das ist wie man es macht...
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']);
}
Ergebnis,
["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"
}
}
... probieren Sie es aus und lassen Sie uns wissen, wie es Ihnen geht!
Update 1:
Fügen Sie dies Ihrer Datei functions.php hinzu.
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]);
}
Mein Update enthält eine etwas einfachere Möglichkeit, die Einstellung Ihrer Menüposition vorzunehmen. Sie müssen nur den Namen Ihrer Untermenüseite und die gewünschte Position innerhalb des Menüs angeben. Wenn Sie jedoch eine Untermenüseite auswählen $location
, die der eines vorhandenen Schlüssels entspricht, wird dieser Schlüssel mit Ihrem überschrieben, sodass der Menüpunkt mit Ihrem Menüpunkt an seiner Stelle verschwindet. Erhöhen oder verringern Sie die Anzahl, um Ihr Menü korrekt zu ordnen, wenn dies der Fall ist. Wenn jemand ein Plugin installiert, das denselben Menübereich betrifft und für das dasselbe $location
wie Ihr Untermenüelement verwendet wird, tritt dasselbe Problem auf. Um dies zu umgehen, bietet Kaisers Beispiel einige grundlegende Überprüfungen dafür.
Update 2:
Ich habe einen zusätzlichen Codeblock hinzugefügt, der alle vorhandenen Schlüssel im Array mit dem gewünschten Code vergleicht. $location
Wenn eine Übereinstimmung gefunden wird, erhöhen wir unseren $location
Wert um, 1
um zu vermeiden, dass sich Menüelemente gegenseitig überschreiben. Dies ist der Code, der dafür verantwortlich ist.
//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;
Update 3: (Skript überarbeitet, um das Sortieren mehrerer Untermenüelemente zu ermöglichen)
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;
}
Im obigen Beispiel können Sie mehrere Untermenüs und mehrere Elemente pro Untermenü als Ziel festlegen, indem Sie die Parameter innerhalb der $target_menu
Variablen, die ein mehrdimensionales Array von Werten enthält, entsprechend einstellen .
$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....
);
Diese Überarbeitung verhindert, dass sich Untermenüelemente gegenseitig überschreiben, wenn sie dieselbe Taste (Position) haben, da sie durchlaufen, bis eine verfügbare Taste (Position) gefunden wird, die nicht vorhanden ist.