Dans le menu Paramètres , les éléments de menu suivants sont répertoriés:
Settings
-- General
-- Writing
-- Reading
-- Discussion
-- Media
-- Permalinks
-- Blogging
J'aimerais que le Blogging (options-general.php?page=blogging
) soit réorganisé sous Général au lieu d'être en bas. Cela a été ajouté avec la fonction add_options_page()
.
En faisant des recherches, voici ce que j’ai trouvé:
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;
}
Cela fonctionne, mais il ne montre que Général et Blogging , le reste est supprimé:
Settings
-- General
-- Blogging
De plus, $submenu['options-general.php'][41]
est actuellement la position d'indexation 41
pour moi. Est-ce que cela signifie que ce sera la même position d'index pour tous les autres, même s'ils ont un autre paramètre de plug-in répertorié?
Grâce à cjbj , j’ai pu obtenir la solution finale:
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;
}
Le résultat obtenu n’est pas surprenant, puisque vous manipulez directement une variable globale. Vous remplacez $submenu
par les éléments des clés 10 et 41 uniquement. Si vous souhaitez suivre cette méthode, vous devrez le faire (en supposant qu'il n'y ait rien à la clé 11):
$submenu['options-general.php'][11] = $submenu['options-general.php'][41];
unset ($submenu['options-general.php'][41]);
Cependant, notez que vous n'utilisez en aucun cas la fonction de filtrage. Rien n'arrive au $menu_order
que vous passez à travers le filtre. Donc, cela ne peut pas être une solution très propre.
Comme vous le savez sans doute, add_submenu_page
ajoute simplement un nouveau sous-menu à la fin du tableau dans l’ordre dans lequel la fonction est appelée. Cette ligne:
$submenu[$parent_slug][] = array ( $menu_title, $capability, $menu_slug, $page_title );
Donc si un nouveau plugin appelle add_submenu_page
avant vous, la clé de 41 pourrait facilement être différente. Pour éviter cela, vous devrez parcourir $submenu
pour trouver la clé correcte. Quick 'n dirty 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
}
}
}
UPDATE
Meilleure version de cette dernière boucle:
$sub = $submenu['options-general.php'];
foreach ( $sub as $key => $details ) {
if ( $details[2] == 'my-custom-slug' ) {
$the_desired_key = $key;
}
}
Après avoir trouvé $the_desired_key
de cette manière, vous pouvez utiliser en toute sécurité la méthode set + unset ci-dessus. J'ai vérifié que 11 est un décalage inutilisé.