Schimbarea Ordinii Secțiunilor din Meniul Admin?
Mă simt destul de frustrat după ce am petrecut câteva ore încercând să realizez această sarcină aparent simplă fără niciun succes.
În esență, am 5 tipuri de postări personalizate pe care le-am creat și tot ce vreau să fac este să le afișez într-o ordine specifică direct sub "dashboard".
Din documentația WordPress reiese că nu poți face acest lucru deoarece cea mai mare ordine de meniu pare să fie "5". Și deasupra.
Presupun că un expert care citește acest lucru îmi poate arăta modalitatea simplă prin care pot ordona meniul administrativ exact așa cum doresc, utilizând fișierul functions.php și fără a utiliza un plugin (care știu că există).
Vă rog să încercați să creați 5 tipuri separate de postări și să le includeți într-o ordine specifică direct sub dashboard... se pare că acest lucru nu este posibil.??... există vreun hack jQuery pentru a face acest lucru să funcționeze pe care cineva ar putea să-l împărtășească cu mine sau, preferabil, fără a utiliza jQuery?

Salut @BinaryBit:
Nu e de mirare că ești puțin frustrat; meniul de administrare este una dintre cele mai obscure și frustrante implementări din nucleul WordPress. Sincer, nu știu la ce se gândeau când l-au proiectat în acest fel.
@EAMann a făcut o explicație excelentă despre cum funcționează meniurile de administrare în WordPress (mi-aș fi dorit să fi citit asta acum 4 luni... :)
Totuși, după ce am înțeles cum funcționează, tot am rămas nedumerit cum să lucrez cu el fără a-mi dedica suficient timp să-mi păstrez claritatea în timp ce încercam să fac lucruri simple. De aceea am construit un API pentru Meniu care simplifică și eficientizează lucrul cu meniul de administrare WordPress.
Sunt 100% compatibile cu structurile existente ale WordPress și încă sunt în stadiu alfa, deoarece am fost singurul care le-a folosit. Sunt sigur că există cazuri de utilizare pe care încă nu le acoperă. Dar voi posta codul aici pentru tine și alții să încercați.
Poți descărca fișierul pentru a-l adăuga în directorul temei tale aici: wp-admin-menu-classes.php și următorul cod arată cum ai putea apela funcțiile în fișierul functions.php
al temei tale:
<?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'); // Schimbă locația secțiunii Posts cu cea a Pages
rename_admin_menu_section('Media','Photos & Video'); // Redenumește secțiunea Media în "Photos & Video"
delete_admin_menu_section('Links'); // Elimină secțiunea Links
$movie_tags_item_array = get_admin_menu_item_array('Movies','Movie Tags'); // Salvează elementul Movie Tags din Meniu
update_admin_menu_section('Movies',array( // Redenumește două elemente din Meniul Movies și șterge Movie Tags
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')); // Copiază 'Add New' din Actors
renamed_admin_menu_item('Movies','Add New','Add Actor'); // Redenumește copiatul 'Add New' din Actors în 'Add Actor
add_admin_menu_item('Movies',array( // (Un alt mod de a adăuga un link 'Add Actor' într-o secțiune.)
'title' => 'Alt Add Actor ',
'slug' => 'post-new.php?post_type=actor',
), array(// Adaugă înapoi Movie Tags la final.
'where'=>'end'
));
add_admin_menu_item('Movies',$movie_tags_item_array,array(// Adaugă înapoi Movie Tags la final.
'where'=>'end'
));
delete_admin_menu_section('Actors'); // În final, elimină secțiunea Actors
}
Mai mult, aceste funcții sunt chiar luate în considerare (ca bază) pentru includere în WordPress 3.1, așa că, dacă avem noroc, acestea ar putea deveni standard!

Fantastică adăugare la API! Mi-a luat luni să adaug prima secțiune de meniu personalizată cu framework-ul existent (de aceea am studiat atât de mult codul)... dar API-ul tău pare mult mai intuitiv de utilizat!

@EAMann - Mulțumesc! Dacă dorești să oferi sugestii sau chiar să colaborezi la îmbunătățirea lui, aș fi încântat să stabilesc ceva care ar putea fi mai ușor pentru toată lumea, nu doar pentru cei care întâmplător văd acest Q&A.

a fost integrat în nucleu sau este încă necesar acest lucru sau ceva similar pentru a manipula ordinea elementelor de meniu în administrare?

Salut Mike - wp_debug aruncă o eroare la această funcție: -------- 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; }
Notice: Variabilă nedefinită: section

Iată o prezentare rapidă a modului în care este construit meniul de administrare WordPress - nu vorbesc despre API-ul add_menu_page
, ci despre meniul implicit WordPress.
Încărcarea fișierului Meniu
Meniul este, evident, încărcat prin wp-admin/admin.php
. Dar nu este încărcat prin API-ul standard pe care suntem obișnuiți să-l folosim conform documentației WordPress. Mai degrabă, întregul meniu (toate opțiunile posibile, submeniuri etc.) sunt încărcate printr-un simplu array definit în wp-admin/menu.php
.
Deci, pentru a încărca sistemul de meniu, admin.php
doar require
menu.php
... în jurul liniei 99 în WordPress 3.0.
Încărcarea Meniului
Meniul în sine este stocat în array-ul global $menu
. Conform documentației inline, array-ul meniului are aceste elemente:
Elementele din array sunt:
* 0: Numele elementului de meniu
* 1: Nivelul minim sau capabilitatea necesară.
* 2: URL-ul fișierului elementului
* 3: Clasa
* 4: ID
* 5: Iconiță pentru meniul principal
De exemplu, Panoul de control este:
$menu[2] = array( __('Dashboard'), 'read', 'index.php', '', 'menu-top menu-top-first menu-icon-dashboard', 'menu-dashboard', 'div' );
Fișierul parcurge și încarcă fiecare element de meniu în array și încarcă toate elementele de submeniu într-un array numit $submenu
care indexează pe baza URL-ului meniului părinte. Deci, elementul de submeniu al Panoului de control numit "Dashboard" este:
$submenu[ 'index.php' ][0] = array( __('Dashboard'), 'read', 'index.php' );
După ce sistemul termină de încărcat toate meniurile (nu sunt multe, dar sistemul parcurge indexul în pași de 5 sau 10... observați că Panoul de control, deși este primul element de meniu, este totuși indexat ca element "2" (array-urile PHP încep de la indexul 0... astfel vă oferă un oarecare spațiu de manevră).
În acest moment, sistemul apelează wp-admin/includes/menu.php
.
Parcurgerea Meniului
Acest al treilea fișier parcurge fiecare element de meniu și, pe baza privilegiilor atribuite utilizatorului curent, fie folosește meniul, fie îl elimină. Mai întâi parcurge toate submeniurile și elimină paginile la care utilizatorul nu are acces. Apoi parcurge paginile părinte și face același lucru. Apoi elimină orice separatori duplicați care rămân după eliminarea meniurilor.
În final, sortează meniurile pe baza ordinii de meniu atribuite.
Ordonarea meniurilor personalizate
Hook-ul admin_menu
este apelat după ce meniurile sunt configurate dar înainte ca orice să fie ordonat. Deci este posibil să ordonați întregul sistem de meniu WordPress fără a "hack-ui" API-ul.
După ce acțiunea admin_menu
este declanșată, paginile dvs. personalizate sunt încărcate în sistem. Următorul lucru care se întâmplă este că WordPress verifică un filtru numit custom_menu_order
... acest filtru este întotdeauna returnat false
și spune WordPress dacă doriți sau nu să folosiți o ordine personalizată.
Adăugați următoarele în tema dvs. pentru a seta flag-ul la true
în loc de false
și pentru a defini ordinea explicită a meniului:
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');
Specificați ordinea pe care o doriți pentru toate meniurile (am furnizat referințe la fișierul de încărcare a meniului pentru a obține o listă de nume de fișiere) și acest lucru ar trebui să rezolve problema.
EDIT (02.09.2010):
Pentru a specifica ordinea ecranului de editare al unui tip de postare personalizată folosind această metodă, trebuie să cunoașteți URL-ul ecranului de editare. În majoritatea cazurilor, acesta va fi http://blog.url/wp-admin/edit.php?post_type=POST_TYPE
. Aceasta depinde de modul în care WordPress este configurat pe site-ul dvs. (dacă este instalat în rădăcină sau într-un subfolder) și de slug-ul tipului de postare personalizată pe care îl folosiți.
De exemplu...
Să presupunem că aveți un tip de postare personalizată pentru 'Întrebări Stack Exchange' și doriți ca editorul să apară în aceeași secțiune cu panoul de control, direct sub iconița panoului de control. Ați folosi următorul cod în fișierul functions.php
al temei dvs.:
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');
Restul meniului va fi neafectat, dar pagina dvs. personalizată de editare va fi mutată în aceeași secțiune cu panoul de control și va apărea imediat sub acesta. Puteți folosi acest lucru pentru a muta tipurile dvs. de postări personalizate în orice secțiune a meniului de administrare și pentru a le plasa în orice ordine. De asemenea, puteți muta elementele standard de meniu în același mod.
Doar asigurați-vă că specificați ordinea tuturor elementelor de meniu din secțiunea dată, altfel meniul dvs. ar putea fi supus unor ciudățenii neașteptate.

Există o mică eroare în exemplul tău de cod din secțiunea "Ordering custom menus", condiția if este lipsită de simbolul $
înaintea numelui variabilei... (Totuși, un răspuns excelent)...

Cum ai putea adăuga tipul personalizat de postare pentru "Întrebări Stack Exchange" într-o secțiune dedesubtul secțiunii Dashboard?

Salut EAMann - o întrebare rapidă. Începând cu cea mai recentă versiune de WordPress, acest proces s-a schimbat sau a devenit mai simplu?

Cum rămâne cu submeniurile? Există o metodă similară pentru a rearanja elementele din submeniu?

@GiraldiMaggio Te rog să pui o întrebare nouă și să faci referire la aceasta.

Îmi dau seama că acesta este un subiect vechi, dar cred că merită actualizat cu o soluție MULT mai ușoară. Rețineți că aceasta funcționează cu versiunea 3.5 și nu a fost testată cu alte versiuni. Următorul cod poate fi plasat într-un plugin sau în fișierul functions.php.
Vedeți: http://codex.wordpress.org/Plugin_API/Filter_Reference/menu_order. Modificat ușor pentru a se potrivi nevoilor posterului original (deși sper că și-a găsit deja o soluție până acum...).
// 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', // Tipul personalizat unu
'edit.php?post_type=custom_type_two', // Tipul personalizat doi
'edit.php?post_type=custom_type_three', // Tipul personalizat trei
'edit.php?post_type=custom_type_four', // Tipul personalizat patru
'edit.php?post_type=custom_type_five', // Tipul personalizat cinci
'separator1', // Primul separator
'edit.php?post_type=page', // Pagini
'edit.php', // Articole
'upload.php', // Media
'link-manager.php', // Legături
'edit-comments.php', // Comentarii
'separator2', // Al doilea separator
'themes.php', // Aspect
'plugins.php', // Plugin-uri
'users.php', // Utilizatori
'tools.php', // Unelte
'options-general.php', // Setări
'separator-last', // Ultimul separator
);
}
add_filter('custom_menu_order', 'custom_menu_order'); // Activează custom_menu_order
add_filter('menu_order', 'custom_menu_order');
Orice elemente din meniul de administrare care nu sunt enumerate aici nu vor fi eliminate. Acestea vor fi adăugate la sfârșitul meniului.

Pentru a muta elementele din meniu, îmi place să folosesc variabila globală $menu
.
De exemplu, dacă aș vrea să mut meniul "Pagini" în partea de jos a meniurilor, aș folosi acest cod în functions.php
sau într-un plugin:
function admin_menu_items() {
global $menu;
$menu[102]=$menu[20];//face ca meniul 102 să fie același cu meniul 20 (pagini)
$menu[20]=array();//face ca meniul original de pagini să dispară
}
add_action('admin_menu', 'admin_menu_items');
Și dacă aș vrea să schimb între ele meniurile "Articole" și "Legături":
function admin_menu_items() {
global $menu;
$storemenu = $menu[15];//salvează meniul de legături în $storemenu
$menu[15] = $menu[5];//face ca meniul de legături să devină meniul de articole
$menu[5] = $storemenu; //face ca meniul 5/articole să devină $storemenu/legături
}
add_action('admin_menu', 'admin_menu_items');
Folosesc acest truc de ceva timp, tocmai l-am testat cu WP 3.4.1

Super. Mulțumesc foarte mult. Tocmai am adăugat câteva linii de cod în functions.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'); // Schimbă locația secțiunii Postări cu cea a Paginilor
}
În plus, am plasat fișierul wp-admin-menu-classes.php în folderul temei mele și acum butonul 'Postări' a fost schimbat cu cel 'Pagini'.
Sper că această funcționalitate va face parte din nucleu în curând, într-un mod care să nu ne oblige să scriem întregul meniu într-o funcție doar pentru a reordona două butoane.
De fapt, a fost un pic mai complicat să obțin o ordine mai specifică pentru 4 butoane. Pentru a schimba ordinea celor 4 butoane în: Pagini, Postări, Media, Legături A fost necesar să folosesc următorul cod:
swap_admin_menu_sections('Pages','Posts');
swap_admin_menu_sections('Media','Legături');
swap_admin_menu_sections('Posts','Legături');
