Ändern der Reihenfolge der Admin-Menübereiche?

31

Ich bin hier ein bisschen frustriert, nachdem ich ein paar Stunden damit verbracht habe, diese ziemlich einfache Aufgabe ohne Glück zu erledigen.

Im Wesentlichen habe ich 5 benutzerdefinierte Beitragstypen, die ich erstellt habe. Ich möchte sie nur in einer bestimmten Reihenfolge direkt unter dem "Dashboard" anzeigen .

Aus der WordPress-Dokumentation geht hervor, dass Sie dies nicht wirklich tun können, da die höchste Menüreihenfolge "5" zu sein scheint. Und über L

Ich vermute, dass ein Fachmann dies liest und mir zeigt, wie einfach ich das Admin-Menü unter Verwendung der Funktionsdatei und ohne Verwendung eines Plugins (von dem ich weiß, dass es existiert) genau so bestellen kann, wie ich es möchte.

Bitte gehen Sie voran und versuchen Sie, 5 separate Beitragstypen zu erstellen und diese in einer bestimmten Reihenfolge direkt unter dem Dashboard einzufügen. Es scheint, dass dies nicht möglich ist könnte mit mir teilen oder am liebsten ohne jQuery?

Binärbit
quelle

Antworten:

33

Hallo @BinaryBit:

Kein Wunder, dass Sie ein bisschen frustriert sind. Das Admin-Menü ist eine der schwierigsten und frustrierendsten Implementierungen über WordPress. Ehrlich gesagt, ich weiß nicht, was sie dachten, als sie es so gestalteten.

@EAMann hat hervorragend erklärt, wie die Admin-Menüs in WordPress funktionieren (ich wünschte, ich hätte das vor ungefähr 4 Monaten lesen können ... :)

Dennoch, nachdem ich herausgefunden hatte, wie es funktionierte, war ich immer noch ratlos, damit zu arbeiten, ohne genug Zeit aufzuwenden, um meinen Kopf gerade zu halten, während ich versuchte, einfache Dinge zu tun. Deshalb habe ich eine Menü-API erstellt , die das Arbeiten mit dem WordPress-Admin-Menü vereinfacht und rationalisiert.

Sie sind zu 100% kompatibel mit den vorhandenen Strukturen von WordPress und noch immer in Alpha, da ich der einzige bin, der es verwendet. Ich bin mir sicher, dass es Use-Cases gibt, die sie noch nicht behandeln. Aber ich werde den Code hier posten, damit Sie und andere ihn ausprobieren können.

Sie können die Datei herunterladen , um sie in das Verzeichnis Ihres Themas zu kopieren : wp-admin-menu-classes.php und was folgt, zeigt, wie Sie die Funktionen in der functions.phpDatei 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, können sie sogar zum Standard werden!

MikeSchinkel
quelle
Fantastische Ergänzung zur API! Es hat Monate gedauert, bis ich meinen ersten benutzerdefinierten Menüabschnitt mit dem vorhandenen Framework hinzugefügt habe (weshalb ich mich intensiv mit dem Code befasst habe) ... aber Ihre API scheint viel intuitiver zu bedienen zu sein!
EAMann
@EAMann - Danke! Wenn Sie Vorschläge machen oder sogar daran mitarbeiten möchten, sie zu verbessern, würde ich gerne etwas etablieren, das es allen erleichtern könnte, außer nur den wenigen, die diese Fragen und Antworten sehen.
MikeSchinkel
hat dies core gemacht oder ist dies oder etwas ähnliches noch erforderlich, um die reihenfolge der menüpunkte im admin zu ändern?
Q Studio
Soweit ich festgestellt habe, wurde es auf WP 3.5
Pixeline 22.09.12
Hey Mike - wp_debug gibt einen Fehler für diese Funktion aus: -------- function swap_admin_menu_sections ($ from_section, $ to_section) {$ from_section = get_admin_menu_section ($ from_section); if ($ from_section) $ from_section-> swap_with ($ to_section); return $ section; } --- Hinweis: Undefinierte Variable: Abschnitt
Q Studio
21

Hier ist eine kurze Anleitung, wie das WordPress-Admin-Menü aufgebaut ist - ich spreche nicht von der add_menu_pageAPI, ich meine das eigentliche Standard-WordPress-Menü.

Aufrufen der Menüdatei

Das Menü wird offensichtlich von geladen wp-admin/admin.php. Es wird jedoch nicht über die Standard-API geladen, die wir basierend auf der WordPress-Dokumentation gewohnt sind. Vielmehr wird das gesamte Menü (alle möglichen Optionen, Untermenüs usw.) über ein einfaches Array geladen, das in definiert ist wp-admin/menu.php.

So das Menüsystem zu laden, admin.phpnur requires menu.php... um die Linie 99 in Wordpress 3.0.

Laden des Menüs

Das Menü selbst wird im globalen Array gespeichert $menu. Laut der Inline-Dokumentation enthält das Menü-Array folgende Elemente:

The elements in the array are:
    *     0: Menu item name
    *     1: Minimum level or capability required.
    *     2: The URL of the item's file
    *     3: Class
    *     4: ID
    *     5: Icon for top level menu

Das Dashboard ist zum Beispiel:

$menu[2] = array( __('Dashboard'), 'read', 'index.php', '', 'menu-top menu-top-first menu-icon-dashboard', 'menu-dashboard', 'div' );

Die Datei durchläuft und lädt jedes Menüelement in das Array und lädt alle Untermenüelemente in ein Array mit dem Namen $submenu, das auf der URL des übergeordneten Menüs basiert. Das Untermenü des Dashboards mit dem Namen "Dashboard" lautet also:

 $submenu[ 'index.php' ][0] = array( __('Dashboard'), 'read', 'index.php' );

Nachdem das System alle Menüs geladen hat (es gibt nicht so viele, aber das System durchläuft den Index jeweils um 5 oder 10 ... Beachten Sie, dass das Dashboard, obwohl es das erste Menüelement ist, immer noch als indiziert ist Punkt "2" (PHP-Arrays beginnen bei Index 0 ... damit Sie etwas Spielraum haben).

Zu diesem Zeitpunkt ruft das System auf wp-admin/includes/menu.php.

Durch das Menü gehen

Diese dritte Datei durchläuft jedes Menüelement und verwendet, basierend auf den dem aktuellen Benutzer zugewiesenen Berechtigungen, entweder das Menü oder entfernt es. Zuerst durchläuft es alle Untermenüs und entfernt Seiten, auf die der Benutzer nicht zugreifen kann. Dann durchläuft es die übergeordneten Seiten und macht dasselbe. Anschließend werden alle doppelten Trennzeichen entfernt, die vom Entfernen von Menüs übrig bleiben.

Schließlich werden die Menüs anhand der zugewiesenen Menüreihenfolge sortiert.

Bestellung von benutzerdefinierten Menüs

Der Hook admin_menuwird aufgerufen, nachdem Menüs eingerichtet wurden, aber bevor etwas bestellt wurde. So ist es möglich, das gesamte WordPress-Menüsystem zu bestellen, ohne die API zu "hacken".

Nachdem die Aktion admin_menuausgelöst wurde, werden Ihre benutzerdefinierten Seiten in das System geladen. Als nächstes prüft WordPress einen Filter namens custom_menu_order... Dieser Filter wird immer zurückgegeben falseund teilt WordPress mit, ob Sie eine benutzerdefinierte Reihenfolge verwenden möchten oder nicht.

Fügen Sie Ihrem Thema Folgendes hinzu, um truestattdessen das Flag zu setzen und Ihre explizite Menüreihenfolge zu definieren:

function custom_menu_order($menu_ord) {
       if (!$menu_ord) return true;
       return array('index.php', 'edit.php', 'edit-comments.php');
}

add_filter('custom_menu_order', 'custom_menu_order');
add_filter('menu_order', 'custom_menu_order');

Geben Sie die gewünschte Reihenfolge für alle Menüs an (ich habe Verweise auf die Menü-Ladedatei angegeben, damit Sie eine Liste der Dateinamen erhalten).


BEARBEITEN (02.09.2010):

Um die Reihenfolge des Bearbeitungsbildschirms eines benutzerdefinierten Beitragstyps mithilfe dieser Methode festzulegen, müssen Sie die URL des Bearbeitungsbildschirms kennen. In den meisten Fällen wird es so sein http://blog.url/wp-admin/edit.php?post_type=POST_TYPE. Dies hängt davon ab, wie WordPress auf Ihrer Site eingerichtet ist (wenn es im Stammverzeichnis oder in einem Unterordner installiert ist) und von der Art des benutzerdefinierten Beitrags, den Sie verwenden.

Beispielsweise...

Angenommen, Sie haben einen benutzerdefinierten Beitragstyp für "Stapelaustauschfragen" und möchten, dass der Editor im selben Abschnitt wie das Dashboard direkt unter dem Dashboard-Symbol angezeigt wird. Sie würden den folgenden Code in der functions.phpDatei Ihres Themas verwenden:

function custom_menu_order($menu_ord) {
       if (!$menu_ord) return true;
       return array('index.php', 'edit.php?post_type=stack_exchange_questions');
}

add_filter('custom_menu_order', 'custom_menu_order');
add_filter('menu_order', 'custom_menu_order');

Der Rest des Menüs bleibt davon unberührt, aber Ihre benutzerdefinierte Bearbeitungsseite wird in denselben Bereich wie das Dashboard verschoben und direkt darunter angezeigt. Sie können diese verwenden, um Ihre benutzerdefinierten Beitragstypen in einen beliebigen Bereich des Administratormenüs zu verschieben und in beliebiger Reihenfolge zu platzieren. Sie können auch Standardmenüelemente auf dieselbe Weise verschieben.

Stellen Sie einfach sicher, dass Sie die Reihenfolge aller Menüelemente in dem angegebenen Abschnitt angeben , da Ihr Menü andernfalls möglicherweise einer unerwarteten Verrücktheit ausgesetzt ist.

EAMann
quelle
Es gibt einen kleinen Fehler in der Beispielcode unter der „Ordering benutzerdefinierte Menüs“ Überschrift, die , wenn bedingte Anweisung der fehlt $auf dem Variablennamen ... (Große Antwort though) ..
t31os
Wie würden Sie den benutzerdefinierten Beitragstyp für "Stapelaustauschfragen" einem Abschnitt unterhalb des Dashboard-Abschnitts hinzufügen ?
Epaps
Hallo EAMann - kurze Frage. Hat sich dieser Prozess seit der neuesten Version von WordPress überhaupt geändert oder ist er einfacher geworden?
NetConstructor.com
Wie wäre es mit Untermenüs ? Gibt es eine ähnliche Methode, um die Untermenüelemente neu anzuordnen ?
Giraldi
@GiraldiMaggio Bitte stellen Sie eine neue Frage und verweisen Sie auf diese.
EAMann
18

Mir ist klar, dass dies ein alter Thread ist, aber ich denke, es lohnt sich, ihn mit einer VIEL einfacheren Lösung zu aktualisieren. Bitte beachten Sie, dass dies mit 3.5 funktioniert und nicht mit einer anderen Version getestet wurde. Der folgende Code kann in ein Plugin oder in die Datei functions.php eingefügt werden.

Siehe: http://codex.wordpress.org/Plugin_API/Filter_Reference/menu_order . Leicht modifiziert, um den Bedürfnissen des ursprünglichen Posters zu entsprechen (obwohl ich hoffe, dass er inzwischen eine Lösung gefunden hat ...).

  // Rearrange the admin menu
  function custom_menu_order($menu_ord) {
    if (!$menu_ord) return true;
    return array(
      'index.php', // Dashboard
      'edit.php?post_type=custom_type_one', // Custom type one
      'edit.php?post_type=custom_type_two', // Custom type two
      'edit.php?post_type=custom_type_three', // Custom type three
      'edit.php?post_type=custom_type_four', // Custom type four
      'edit.php?post_type=custom_type_five', // Custom type five
      'separator1', // First separator
      'edit.php?post_type=page', // Pages
      'edit.php', // Posts
      'upload.php', // Media
      'link-manager.php', // Links
      'edit-comments.php', // Comments
      'separator2', // Second separator
      'themes.php', // Appearance
      'plugins.php', // Plugins
      'users.php', // Users
      'tools.php', // Tools
      'options-general.php', // Settings
      'separator-last', // Last separator
    );
  }

  add_filter('custom_menu_order', 'custom_menu_order'); // Activate custom_menu_order
  add_filter('menu_order', 'custom_menu_order');

Alle Elemente im Admin-Menü, die hier nicht aufgeführt sind, werden nicht entfernt. Sie werden am Ende des Menüs angehängt.

Matt
quelle
1
Ja, das ist viel besser, auch um Untermenüpunkte neu zu ordnen, können Sie sie deaktivieren und dann zurücksetzen.
Wyck
2

Sie möchten kein Plugin verwenden, aber der Einfachheit halber sollten Sie das Plugin Admin Menu Editor von Janis Elsts ausprobieren. Ordnen Sie Ihre Admin-Menüs nach Ihren Wünschen neu an. kann auch Menüpunkte ausblenden.

Ray Gulick
quelle
Ich habe dieses Plugin in der Multisite-Installation ausprobiert. Es funktioniert am besten. Aber wir müssen die Optionen für jeden Sub-Site manuell konfigurieren, wenn wir eine Multisite-Installation haben.
User391
2

Zum Verschieben von Menüelementen verwende ich gerne die globale $menuVariable.

Wenn ich zum Beispiel das Menü "Seiten" an den unteren Rand der Menüs verschieben möchte, würde ich dies in functions.phpoder ein Plugin verwenden:

function admin_menu_items() {
    global $menu;
    $menu[102]=$menu[20];//make menu 102 be the same as menu 20 (pages)
    $menu[20]=array();//make original pages menu disappear

}
add_action('admin_menu', 'admin_menu_items');

und wenn ich die Posts und Links Menüs tauschen wollte:

function admin_menu_items() {
    global $menu;
    $storemenu = $menu[15];//save links menu into $storemenu
    $menu[15] = $menu[5];//make links menu = posts menu
    $menu[5] = $storemenu; //make menu 5/posts = $storemenu/links   
}
add_action('admin_menu', 'admin_menu_items');

Ich benutze diesen Trick schon eine Weile, habe ihn gerade mit WP 3.4.1 getestet

Forlogos
quelle
Ich weiß, dass dies ein älterer Beitrag ist, aber in Bezug auf Ihr erstes Snippet bin ich auf ein Problem mit der letzten Zeile in der admin_menu_itemsFunktion unset($menu[20]);
gestoßen,
0

Genial. Ich danke dir sehr. Ich habe nur ein paar Codezeilen in meine functions.php eingefügt

require_once('/extras/wp-admin-menu-classes.php');
add_action('admin_menu','my_admin_menu');
function my_admin_menu() {
  swap_admin_menu_sections('Pages','Posts'); // Swop location of Posts Section with Pages Section
}

Außerdem lege ich die Datei wp-admin-menu-classes.php in meinen Themenordner und jetzt wird die Schaltfläche "Beiträge" durch die Schaltfläche "Seiten" ersetzt.

Ich hoffe, dass dies bald Teil des Kerns wird, sodass wir nicht das gesamte Menü innerhalb einer Funktion schreiben müssen, um nur zwei Tasten neu anzuordnen.

Tatsächlich war es etwas schwierig, eine genauere Reihenfolge für 4 Schaltflächen zu erhalten. Um die von 4 Schaltflächen in "Seiten", "Post", "Medien" und "Links" zu ändern, musste ich den folgenden Code verwenden:

  swap_admin_menu_sections('Pages','Posts');                
  swap_admin_menu_sections('Media','Links');                 
  swap_admin_menu_sections('Posts','Links');
Sebastian
quelle