Ordnen Sie das benutzerdefinierte Untermenüelement neu an

Im Menü Einstellungen habe ich folgende Menüpunkte aufgelistet:

Settings -- General -- Writing -- Reading -- Discussion -- Media -- Permalinks -- Blogging 

Ich möchte das Blogging ( options-general.php?page=blogging ) neu geordnet unter General statt unten zu sein. Dies wurde mit der function add_options_page() hinzugefügt.

Aus meiner Recherche habe ich folgendes herausgefunden:

 add_filter( 'custom_menu_order', array( $this, 'submenu_order' ) ); function submenu_order( $menu_order ) { global $submenu; $order = array(); $order[] = $submenu['options-general.php'][10]; $order[] = $submenu['options-general.php'][41]; $submenu['options-general.php'] = $order; return $menu_order; } 

Das funktioniert, aber es zeigt nur Allgemein und Blogging , der Rest wird entfernt:

 Settings -- General -- Blogging 

Außerdem ist $submenu['options-general.php'][41] zur Zeit Indexposition 41 für mich. Bedeutet dies, dass es für alle anderen dieselbe Indexposition ist, selbst wenn sie andere Plugin-Einstellungen aufgelistet haben?

Solutions Collecting From Web of "Ordnen Sie das benutzerdefinierte Untermenüelement neu an"

Dank cjbjs Hilfe konnte ich die endgültige Lösung finden:

 add_filter( 'custom_menu_order', 'submenu_order' ); function submenu_order( $menu_order ) { # Get submenu key location based on slug global $submenu; $settings = $submenu['options-general.php']; foreach ( $settings as $key => $details ) { if ( $details[2] == 'blogging' ) { $index = $key; } } # Set the 'Blogging' menu below 'General' $submenu['options-general.php'][11] = $submenu['options-general.php'][$index]; unset( $submenu['options-general.php'][$index] ); # Reorder the menu based on the keys in ascending order ksort( $submenu['options-general.php'] ); # Return the new submenu order return $menu_order; } 

Das Ergebnis ist nicht überraschend, da Sie eine globale Variable direkt manipulieren. Sie ersetzen $submenu nur durch die Elemente mit den Schlüsseln 10 und 41. Wenn Sie dieser Methode folgen möchten, müssten Sie dies tun (vorausgesetzt, es gibt nichts an Schlüssel 11):

 $submenu['options-general.php'][11] = $submenu['options-general.php'][41]; unset ($submenu['options-general.php'][41]); 

Beachten Sie jedoch, dass Sie die Filterfunktion in keiner Weise verwenden. Nichts geschieht mit der $menu_order , die Sie durch den Filter passieren. Also, das kann keine sehr saubere Lösung sein.

Wie Sie zweifellos gesehen haben, fügt add_submenu_page einfach ein neues Untermenü am Ende des Arrays in der Reihenfolge hinzu, in der die function aufgerufen wird. Diese Linie:

 $submenu[$parent_slug][] = array ( $menu_title, $capability, $menu_slug, $page_title ); 

Wenn also ein neues Plugin add_submenu_page aufrufen add_submenu_page , könnte der Schlüssel von 41 leicht ein anderer sein. Um dies zu verhindern, müssten Sie das $submenu durchlaufen, um den richtigen Schlüssel zu finden. Schnelle ‘n dreckige Version:

 for ( $i = 1; $i < = 100; $i++ ) { if ( array_key_exists( $submenu['options-general.php'][$i] ) ) { if ( $submenu['options-general.php'][$i][2] == 'my-custom-slug' ) { $the_desired_key = $i; // [2] because that is the index of the slug in the submenu item array above } } } 

AKTUALISIEREN

Bessere Version der letzten Schleife:

 $sub = $submenu['options-general.php']; foreach ( $sub as $key => $details ) { if ( $details[2] == 'my-custom-slug' ) { $the_desired_key = $key; } } 

Nachdem $the_desired_key auf diese Weise $the_desired_key , können Sie die Methode set + unset oben sicher verwenden. Ich habe überprüft, 11 ist ein ungenutzter Offset.