web-dev-qa-db-fra.com

Réorganiser un élément de sous-menu personnalisé

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é?

3

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;
}
6

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é.

4
cjbj