web-dev-qa-db-de.com

Ändern der Reihenfolge der Admin-Menübereiche?

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 "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 einzuschließen. Es scheint, dass dies nicht möglich ist könnte mit mir teilen oder am liebsten ohne jQuery?

31
Binarybit

Hallo @BinaryBit:

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

@EAMann hat ein excellenterklä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 sie 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 downloaddie Datei, die im Verzeichnis Ihres Themas abgelegt werden soll, hier herunterladen: wp-admin-menu-classes.php und das Folgende zeigt, wie Sie die Funktionen aufrufen können in der functions.php Datei deines Themas:

<?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 sind diese Funktionen sogar als Grundlage für die Aufnahme in WordPress 3.1 in Betracht gezogen) . Wenn wir also Glück haben, können sie sogar zum Standard werden!

33
MikeSchinkel

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

Aufrufen der Menüdatei

Das Menü wird natürlich von wp-admin/admin.php geladen. 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 wp-admin/menu.php definiert ist.

Um das Menüsystem zu laden, admin.php nur requires menu.php ... um die Zeile 99 in WordPress 3.0.

Laden des Menüs

Das Menü selbst ist im globalen Array $menu gespeichert. 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 basierend auf der URL des übergeordneten Menüs indiziert. 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 ... dies gibt Ihnen einen gewissen Handlungsspielraum).

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

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_menu wird 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_menu ausgelöst wurde, werden Ihre benutzerdefinierten Seiten in das System geladen. Als nächstes überprüft WordPress einen Filter namens custom_menu_order ... dieser Filter wird immer als false zurückgegeben und teilt WordPress mit, ob Sie eine benutzerdefinierte Reihenfolge verwenden möchten oder nicht.

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

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 http://blog.url/wp-admin/edit.php?post_type=POST_TYPE sein. 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.

Zum Beispiel...

Angenommen, Sie haben einen benutzerdefinierten Beitragstyp für "Stapelaustauschfragen" und möchten, dass der Editor im selben Bereich wie das Dashboard direkt unter dem Dashboard-Symbol angezeigt wird. Sie würden den folgenden Code in der functions.php-Datei 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 , sonst kann Ihr Menü einer unerwarteten Verrücktheit unterliegen.

21
EAMann

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 mit keiner 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.

18
Matt

Zum Verschieben von Menüelementen verwende ich gerne die Variable Global $menu.

Wenn ich zum Beispiel das Menü "Seiten" an den unteren Rand der Menüs verschieben möchte, würde ich dies in functions.php oder einem 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 habe diesen Trick eine Weile benutzt und ihn gerade mit WP 3.4.1 getestet

2
forlogos

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.

2
Ray Gulick

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 platziere ich die Datei wp-admin-menu-classes.php in meinem 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');
0
Sebastian