Sortieren Sie die Admin-Menüelemente


8

In einem verwandten Hinweis zu " Ändern der Reihenfolge der Admin-Menüabschnitte? " Suche ich nach einer Möglichkeit, die Einträge in jedem Unterabschnitt des WordPress-Admin-Bereichs alphabetisch zu sortieren.

Wenn ein neues Plugin hinzugefügt wird, wird sein Eintrag derzeit an einer scheinbar zufälligen Stelle unter Einstellungen / Tools / Plugins angezeigt, und es ist oft schwierig, den neuen Menüpunkt zu finden. (Ich habe bereits viele Plugins, daher sind meine Menüs ziemlich voll.)

Da ich Plugins ziemlich regelmäßig hinzufüge und entferne, muss ich lieber nicht ständig auf die Einstellungsseite für ein Plugin für die Menübestellung gehen und die Reihenfolge anpassen.

Entschuldigung für die lange Frage; Ich möchte nur klarstellen, wonach ich suche.

Beispiel

Anstatt:

    die Einstellungen
    - Allgemeines
    - Schreiben
    - Lesen
    - Diskussion
    - (Rest der Kernelemente)
    - Plugin 4
    - WP etwas
    - Ein Plugin, um bei Sachen zu helfen
    - Google-bezogenes Plugin
    - RSS-Plugin
    - FeedBurner Plugin
    - usw.

Kann ich das Menü alphabetisch sortieren lassen (oder nach einer anderen logischen Methode), z.

    die Einstellungen
    - Ein Plugin, um bei Sachen zu helfen
    - Diskussion
    - FeedBurner Plugin
    - Allgemeines
    - Google-bezogenes Plugin
    - Plugin 4
    - Lesen
    - (Rest der Kernelemente)
    - RSS-Plugin
    - WP etwas
    - Schreiben
    - usw.

Noch besser wäre eine Sortiermethode, bei der die Kerneinträge standardmäßig dort bleiben, wo sie sich befinden, und nur Elemente sortiert werden, die von Plugins hinzugefügt wurden:

    die Einstellungen
    - Allgemeines
    - Schreiben
    - Lesen
    - Diskussion
    - (Rest der Kernelemente)
    - Ein Plugin, um bei Sachen zu helfen
    - FeedBurner Plugin
    - Google-bezogenes Plugin
    - Plugin 4
    - RSS-Plugin
    - WP etwas
    - usw.

Antworten:


4

Es kann die globale Sortierung durchgeführt werden $submenu.

Durch die angewendete Sortierung wird die Schlüsselnummer des Subarrays zurückgesetzt $submenu['options-general.php']:

array
  'options-general.php' => 
    array
      10 => 
        array
          0 => string 'General'
          1 => string 'manage_options'
          2 => string 'options-general.php'
      15 => 
        array
          0 => string 'Writing'
          1 => string 'manage_options'
          2 => string 'options-writing.php'
      // etc

und wird:

array
  'options-general.php' => 
    array
      0 => 
        array
          0 => string 'Discussion'
          1 => string 'manage_options'
          2 => string 'options-discussion.php'
      1 => 
        array
          0 => string 'General'
          1 => string 'manage_options'
          2 => string 'options-general.php'
      // etc

Hier betrachten wir die Länge der Standardelemente gleich sechs. Vor WordPress 3.5 gab es 7 Elemente. Der Datenschutz ist jetzt weg und in die Registerkarte Lesen eingebettet .

Beim lokalen Testen führt dies zu keinem unerwarteten Ergebnis und funktioniert einwandfrei. Wenn ein Plugin davon abhängt $submenu['options-general.php'][15], sich selbst oder etwas anderes zu positionieren, können möglicherweise Fehler auftreten.

Die Sortierung wird für die Standardelemente und für die übrigen Elemente separat angewendet. Deaktivieren Sie einfach usortden ersten Block und Sie haben die gewünschte Ausgabe.

add_action( 'admin_menu', 'sort_settings_menu_wpse_2331', 999 );

function sort_settings_menu_wpse_2331() 
{
    global $submenu;

    // Sort default items
    $default = array_slice( $submenu['options-general.php'], 0, 6, true );
    usort( $default, 'sort_arra_asc_so_1597736' );

    // Sort rest of items
    $length = count( $submenu['options-general.php'] );
    $extra = array_slice( $submenu['options-general.php'], 6, $length, true );
    usort( $extra, 'sort_arra_asc_so_1597736' );

    // Apply
    $submenu['options-general.php'] = array_merge( $default, $extra );
}

//http://stackoverflow.com/a/1597788/1287812
function sort_arra_asc_so_1597736( $item1, $item2 )
{
    if ($item1[0] == $item2[0]) return 0;
    return ( $item1[0] > $item2[0] ) ? 1 : -1;
}

neu angeordnete Menüpunkte


3

Ich suchte nach dem gleichen Ding und dachte mir, ich würde den von Mike bereitgestellten Code kopieren, von dem er behauptet, dass er immer noch sehr viel in Alpha ist, da nur er ihn verwendet hat.

Ich habe es getestet und es scheint gut für mich zu funktionieren. Ich bin sicher, dass es Anwendungsfälle gibt, die sie noch nicht behandeln.

Vielleicht wird Mike hier einen Kommentar abgeben und zusätzliche Hilfe geben, wie Sie seine Klasse verwenden können, um Ihre Ziele zu erreichen.

Sie können die Datei herunterladen, um sie im Verzeichnis Ihres Themas abzulegen: https://gist.github.com/792b7aa5b695d1092520

Im Folgenden wird gezeigt, wie Sie die Funktionen in der Datei functions.php Ihres Themas aufrufen können:

<?php
require_once('wp-admin-menu-classes.php');
add_action('admin_menu','my_admin_menu');
function my_admin_menu() {
  swap_admin_menu_sections('Pages','Posts');              // Swap location of Posts Section with Pages Section
  rename_admin_menu_section('Media','Photos & Video');    // Rename Media Section to "Photos & Video"
  delete_admin_menu_section('Links');                     // Get rid of Links Section
  $movie_tags_item_array = get_admin_menu_item_array('Movies','Movie Tags');  // Save off the Movie Tags Menu
  update_admin_menu_section('Movies',array(               // Rename two Movie Menu Items and Delete the Movie Tags Item
    array('rename-item','item'=>'Movies','new_title'=>'List Movies'),
    array('rename-item','item'=>'Add New','new_title'=>'Add Movie'),
    array('delete-item','item'=>'Movie Tags'),
  ));
  copy_admin_menu_item('Movies',array('Actors','Add New')); // Copy the 'Add New' over from Actors
  renamed_admin_menu_item('Movies','Add New','Add Actor');  // Rename copied Actor 'Add New' to 'Add Actor
  add_admin_menu_item('Movies',array(                       // (Another way to get a 'Add Actor' Link to a section.)
    'title' => 'Alt Add Actor ',
    'slug' => 'post-new.php?post_type=actor',
  ), array(// Add Back the Movie Tags at the end.
    'where'=>'end'
  ));
  add_admin_menu_item('Movies',$movie_tags_item_array,array(// Add Back the Movie Tags at the end.
    'where'=>'end'
  ));
  delete_admin_menu_section('Actors');                      // Finally just get rid of the actors section
}

Darüber hinaus werden diese Funktionen (als Basis) für die Aufnahme in WordPress 3.1 in Betracht gezogen. Wenn wir Glück haben, werden sie möglicherweise sogar zum Standard!


Es klingt nach viel Code, aber ich sehe nicht, wo Untereinträge automatisch sortiert werden.
dgw

1

Dachte, dies könnte als weitere Option nützlich sein. Hier ist eine einfache Verwendung im globalen Untermenü $. Ich verwende den Hook admin_init, da in admin_menu möglicherweise noch andere Plugins Untermenüelemente hinzufügen (in meinem Fall war dies zu früh, um sortiert zu werden). Beachten Sie auch, dass für die anonyme (Lambda) Funktion im Usort PHP 5.3+ erforderlich ist.

<?php 
add_action('admin_init','my_admin_init');
function my_admin_init() {
    global $submenu;
    $submenu_key = 'my_key'; // See note below on $submenu_key
    if ( array_key_exists( $submenu_key, $submenu ) ) {
        // alphabetize submenu items
        usort( $submenu[ $submenu_key ], function ( $a, $b ) {
            // format of a submenu item is [ 'My Item', 'read', 'manage-my-items', 'My Item' ]
            return strcasecmp( $a[0], $b[0] );
        } );
    }
}

Beachten Sie, dass $submenu_keysich dies $parent_slugin add_submenu_page befindet , was dasselbe ist wie $menu_slugin add_menu_page .


1
Schön und kompakt. Was $submenu_keyrepräsentiert? Nennt WordPress das $parent slugin den Dokumenten zu add_submenu_page ?
random_user_name

@cale_b Gute Frage! Sie haben $parent_slugRecht , es befindet sich in den Dokumenten zu add_submenu_page, die mit denen $menu_slugin add_menu_page identisch sind.
Ryanm
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.