Zmieniasz kolejność sekcji menu administratora?


31

Czuję się trochę sfrustrowany, gdy spędziłem kilka godzin, próbując wykonać to dość proste zadanie bez powodzenia.

Zasadniczo mam 5 niestandardowych typów postów, które utworzyłem, i wszystko, co chcę zrobić, to pokazać każdy z nich w określonej kolejności bezpośrednio pod „pulpitem” .

Z dokumentacji WordPressa wynika, że ​​tak naprawdę nie można tego zrobić, ponieważ najwyższą kolejnością menu wydaje się być „5”. I powyżej L.

Zgaduję, że jakiś ekspert czytający to może pokazać mi prosty sposób, w jaki mogę zamówić menu administratora dokładnie tak, jak chcę, wykorzystując plik funkcji i bez użycia wtyczki (o której wiem, że istnieje).

Spróbuj utworzyć 5 osobnych typów postów i umieść je w określonej kolejności bezpośrednio pod pulpitem nawigacyjnym ... wydaje się, że nie jest to możliwe. ?? ... czy istnieje jakiś hack jquery, aby ktoś działał czy mógłbyś się ze mną podzielić lub najlepiej bez korzystania z jQuery?

Odpowiedzi:


33

Cześć @BinaryBit:

Nic dziwnego, że jesteś trochę sfrustrowany; menu administracyjne jest jedną z najbardziej tępych i frustrujących implementacji dzięki rdzeniu WordPress. Szczerze mówiąc, nie wiem, co myśleli, kiedy zaprojektowali to w ten sposób.

@EAMann wykonał świetną robotę, wyjaśniając, jak działają menu administracyjne w WordPress (chciałbym móc to przeczytać około 4 miesiące temu ... :)

Jednak po tym, jak zorientowałem się, jak to działa, nadal nie mogłem z nim pracować, nie poświęcając wystarczająco dużo czasu, aby utrzymać głowę prosto, gdy próbowałem robić proste rzeczy. Dlatego właśnie zbudowałem API menu, które upraszcza i usprawnia pracę z menu administracyjnym WordPress.

Są w 100% kompatybilne z istniejącymi strukturami WordPress i wciąż bardzo alfa, odkąd tylko ja go używam. Jestem pewien, że istnieją przypadki użycia, których jeszcze nie obsługują. Ale opublikuję kod tutaj, abyś ty i inni mogli go wypróbować.

Możesz pobrać plik, aby upuścić go w katalogu motywu tutaj: wp-admin-menu-klas.php, a poniżej pokazano, jak możesz wywoływać funkcje w functions.phppliku motywu :

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

Co więcej, funkcje te są nawet rozważane (jako podstawa) do włączenia do WordPress 3.1, więc jeśli będziemy mieli szczęście, mogą nawet stać się standardem!


Fantastyczny dodatek do API! Dodanie pierwszej niestandardowej sekcji menu z istniejącym frameworem zajęło mi miesiące (dlatego studiowałem kod, aby wiele zrobić) ... ale interfejs API wydaje się być bardziej intuicyjny!
EAMann

@EAMann - Dzięki! Jeśli chcesz zaoferować jakieś sugestie, a nawet współpracować nad jego ulepszeniem, chciałbym uzyskać coś, co ułatwiłoby wszystkim, z wyjątkiem nielicznych, którzy widzą to pytanie.
MikeSchinkel,

czy to zrobiło rdzeń, czy to lub coś podobnego jest nadal wymagane do manipulowania kolejnością pozycji menu w adminie?
Q Studio

O ile się dowiedziałem, został on przełożony na WP 3.5
pixeline

Hej Mike - wp_debug zgłasza błąd tej funkcji: -------- function swap_admin_menu_section ($ from_section, $ to_section) {$ from_section = get_admin_menu_section ($ from_section); if ($ from_section) $ from_section-> swap_with ($ to_section); zwróć sekcję $; } --- Uwaga: Zmienna niezdefiniowana: sekcja
Q Studio

21

Oto krótki opis budowy menu administratora WordPress - nie mówię o add_menu_pageinterfejsie API, mam na myśli rzeczywiste domyślne menu WordPress.

Wywoływanie pliku menu

Menu jest oczywiście ładowane przez wp-admin/admin.php. Ale nie jest ładowany przez standardowy interfejs API, którego używamy na podstawie dokumentacji WordPress. Całe menu (wszystkie możliwe opcje, podmenu itp.) Są ładowane za pomocą prostej tablicy, która jest zdefiniowana w wp-admin/menu.php.

Tak więc aby załadować system menu, admin.phppo prostu requires menu.php... wokół linii 99 w WordPress 3.0.

Ładowanie menu

Samo menu jest przechowywane w globalnej tablicy $menu. Zgodnie z dokumentacją on-line tablica menu zawiera następujące elementy:

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

Na przykład pulpit nawigacyjny to:

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

Plik przechodzi i ładuje każdy element menu do tablicy i ładuje wszystkie jego elementy z podmenu do tablicy o nazwie $submenuindeksującej na podstawie adresu URL menu nadrzędnego. Zatem podmenu Pulpitu nawigacyjnego o nazwie „Pulpit nawigacyjny” to:

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

Po zakończeniu ładowania systemu do wszystkich menu (nie ma ich zbyt wiele, ale system przechodzi przez indeks jednocześnie o 5 lub 10 ... zauważ, że pulpit nawigacyjny, mimo że jest to pierwszy element menu, jest nadal indeksowany jako pozycja „2” (tablice PHP zaczynają się od indeksu 0 ... więc daje to trochę miejsca do manewrowania).

W tym momencie system dzwoni wp-admin/includes/menu.php.

Przechodzenie przez menu

Ten trzeci plik przechodzi przez każdą pozycję menu i, w oparciu o uprawnienia przypisane bieżącemu użytkownikowi, korzysta z menu lub go usuwa. Najpierw przechodzi przez wszystkie podmenu i usuwa strony, do których użytkownik nie ma dostępu. Następnie przechodzi przez strony nadrzędne i robi to samo. Następnie usuwa wszelkie zduplikowane separatory, które pozostały po wyeliminowaniu menu.

Na koniec sortuje menu według przydzielonej im kolejności menu.

Zamawianie niestandardowych menu

Hak admin_menujest wywoływany po skonfigurowaniu menu, ale zanim cokolwiek zostanie zamówione. Możliwe jest więc zamówienie całego systemu menu WordPress bez „hakowania” interfejsu API.

Po uruchomieniu akcji admin_menuniestandardowe strony są ładowane do systemu. Następną rzeczą, która się dzieje, jest WordPress sprawdza filtr o nazwie custom_menu_order... ten filtr jest zawsze zwracany falsei informuje WordPress, czy chcesz użyć niestandardowego zamówienia.

Dodaj do motywu następujące elementy, aby truezamiast tego ustawić flagę i zdefiniuj wyraźną kolejność menu:

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');

Określ żądaną kolejność dla wszystkich menu (podałem odniesienia do pliku ładującego menu, abyś mógł uzyskać listę nazw plików), a to powinno się tym zająć.


EDYCJA (9.02.2010):

Aby określić kolejność ekranu edycji niestandardowego typu postu za pomocą tej metody, musisz znać adres URL ekranu edycji. W większości przypadków tak będzie http://blog.url/wp-admin/edit.php?post_type=POST_TYPE. Zależy to od tego, jak WordPress jest skonfigurowany w Twojej witrynie (jeśli jest zainstalowany w katalogu głównym lub w podfolderze) i informacji o typie niestandardowego posta, którego używasz.

Na przykład...

Załóżmy, że masz niestandardowy typ postu „Pytania dotyczące wymiany stosu” i chcesz, aby edytor pojawiał się w tej samej sekcji co pulpit nawigacyjny bezpośrednio pod ikoną pulpitu nawigacyjnego. W functions.phppliku motywu użyjesz następującego kodu :

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');

Reszta menu pozostanie niezmieniona, ale Twoja niestandardowa strona edycji zostanie przeniesiona do tej samej sekcji co pulpit nawigacyjny i pojawi się bezpośrednio pod nią. Możesz użyć tego, aby przenieść niestandardowe typy postów do dowolnej sekcji menu administratora i umieścić je w dowolnej kolejności. Możesz także przenosić standardowe pozycje menu w ten sam sposób.

Po prostu upewnij się, że określiłeś kolejność wszystkich pozycji menu w danej sekcji , w przeciwnym razie twoje menu może być przedmiotem nieoczekiwanej dziwności.


W przykładowym kodzie występuje niewielki błąd pod nagłówkiem „Zamawianie niestandardowych menu”, w instrukcji warunkowej if brakuje $nazwy zmiennej ... (Świetna odpowiedź) ..
t31os

Jak dodać niestandardowy typ postu „Stos wymiany pytań” do sekcji poniżej sekcji Pulpit nawigacyjny?
epaps

Cześć EAMann - szybkie pytanie. Od kiedy najnowsza wersja wordpress w ogóle zmieniła ten proces lub stała się prostsza?
NetConstructor.com

Co powiesz na podmenu ? Czy istnieje podobna metoda zmiany kolejności elementów podmenu ?
Giraldi

@GiraldiMaggio Zadaj nowe pytanie i zapoznaj się z tym.
EAMann

18

Zdaję sobie sprawę, że to stary wątek, ale myślę, że warto zaktualizować go DUŻO łatwiejszym rozwiązaniem. Pamiętaj, że działa to z wersją 3.5 i nie zostało przetestowane z żadną inną wersją. Poniższy kod można umieścić we wtyczce lub w pliku functions.php.

Zobacz: http://codex.wordpress.org/Plugin_API/Filter_Reference/menu_order . Nieznacznie zmodyfikowany, by pasował do oryginalnego postera plakatu (mam jednak nadzieję, że do tej pory znalazł rozwiązanie ...).

  // 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');

Wszelkie elementy w menu administratora, które nie są tutaj wymienione, nie zostaną usunięte. Zostaną one dodane na dole menu.


1
Tak, jest to znacznie lepsze, również w celu ponownego zamówienia elementów podmenu, które można rozbroić, a następnie zresetować.
Wyck,

2

Rozumiem, że nie chcesz używać wtyczki, ale dla uproszczenia wypróbuj wtyczkę Admin Menu Editor autorstwa Janis Elsts. Zmień układ menu administratora w dowolny sposób; może również ukryć pozycje menu.


Wypróbowałem tę wtyczkę w instalacji na wielu stronach. Działa najlepiej, ale musimy ręcznie skonfigurować opcje dla każdej podstrony, jeśli mamy instalację na wielu stronach.
user391

2

Do poruszania się po menu lubię używać $menuzmiennej Global .

Na przykład, jeśli chciałbym przenieść menu „Strony” na dół menu, użyłbym tego functions.phplub wtyczki:

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');

a gdybym chciał zamienić menu postów i linków:

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');

Trochę używałem tej sztuczki, właśnie przetestowałem z WP 3.4.1


Wiem, że to starszy post, ale w odniesieniu do pierwszego fragmentu napotkałem problem z ostatnim wierszem admin_menu_itemsfunkcji, który został naprawiony przez zastąpienie gounset($menu[20]);
hot_barbara

0

Niesamowite. Dziękuję bardzo. Po prostu wstawiłem kilka wierszy kodu do swoich funkcji.php

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
}

Plus umieszczenie wp-admin-menu-klas.php w moim folderze motywów, a teraz przycisk „posty” jest zastąpiony przyciskiem „strony”.

Mam nadzieję, że wkrótce stanie się to częścią rdzenia, dzięki czemu nie będziemy musieli pisać całego menu w ramach funkcji, aby zmienić kolejność dwóch przycisków.

W rzeczywistości nieco trudniej było uzyskać bardziej szczegółowe zamówienie na 4 przyciski. Aby zmienić 4 przyciski na: Strony, Post, Media, Linki Potrzebowałem użyć następującego kodu:

  swap_admin_menu_sections('Pages','Posts');                
  swap_admin_menu_sections('Media','Links');                 
  swap_admin_menu_sections('Posts','Links');
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.