Plasarea unui meniu Custom Post Type deasupra meniului Posts folosind menu_position
Tocmai am descoperit parametrul menu_position și se pare că poți plasa meniul pentru tipul tău personalizat de postare aproape oriunde. Cu excepția poziționării deasupra meniului Posts!
Cum pot realiza acest lucru?
Poziții pentru elementele principale din meniu
- 2 Panou de control
- 4 Separator
- 5 Articole
- 10 Media
- 15 Legături
- 20 Pagini
- 25 Comentarii
- 59 Separator
- 60 Aspect
- 65 Plugin-uri
- 70 Utilizatori
- 75 Unelte
- 80 Setări
- 99 Separator
Descrierea parametrului pentru "poziția în meniu"
$position
(integer) (opțional) Poziția în ordinea meniului unde acest element ar trebui să apară. Implicit, dacă acest parametru este omis, elementul va apărea la baza structurii meniului. Cu cât numărul este mai mare, cu atât poziția sa în meniu va fi mai jos.ATENȚIE: dacă două elemente de meniu folosesc același atribut de poziție, unul dintre ele poate fi suprascris astfel încât doar un element va fi afișat! Riscul de conflict poate fi redus folosind valori zecimale în loc de numere întregi, de exemplu 63.3 în loc de 63.
Implicit: baza structurii meniului

Noul plugin JetPack își plasează linkul din meniu imediat sub linkul Dashboard. Acest lucru se întâmplă prin setarea ordinii meniului la 0, prin filtrarea array-ului $menu_order:
function jetpack_menu_order( $menu_order ) {
// Inițializăm un nou array pentru ordinea meniului JetPack
$jp_menu_order = array();
// Parcurgem fiecare element din ordinea inițială a meniului
foreach ( $menu_order as $index => $item ) {
// Adăugăm toate elementele în afară de 'jetpack'
if ( $item != 'jetpack' )
$jp_menu_order[] = $item;
// După primul element (index 0), adăugăm 'jetpack'
if ( $index == 0 )
$jp_menu_order[] = 'jetpack';
}
// Returnăm noua ordine a meniului
return $jp_menu_order;
}
Din curiozitate, ce s-ar întâmpla dacă ai încerca să setezi menu_position la 0?

Căutam o soluție pe internet dar nu am găsit. Pur și simplu funcționează acest truc (de exemplu). Aici aveți lista nativă de poziții:
- 2 Dashboard
- 4 Separator
- 5 Posts
- 10 Media
- 15 Links
- 20 Pages
- 25 Comments
- 59 Separator
- 60 Appearance
- 65 Plugins
- 70 Users
- 75 Tools
- 80 Settings
- 99 Separator
Dacă aveți mai multe elemente, puteți citi poziția curentă pentru fiecare element afișând globalul $menu:
global $menu;
print_r($menu);
Deci, dacă am înțeles bine, nimic nu ne poate împiedica să reordonăm meniul așa cum dorim:
function re_order_menu () {
// ------- Elimină elementele
$dashboard = $menu[2]
$separator1 = $menu[4]
$posts = $menu[5]
$media = $menu[10]
$links = $menu[15]
$pages = $menu[20]
$comments = $menu[25]
$separator2 = $menu[59]
$appearance = $menu[60]
$plugins = $menu[65]
$users = $menu[70]
$tools = $menu[75]
$settings = $menu[80]
$separator3 = $menu[99]
// -------- Resetează meniul
unset($menu[2]);
unset($menu[4]);
unset($menu[5]);
unset($menu[10]);
unset($menu[15]);
unset($menu[20]);
unset($menu[25]);
unset($menu[59]);
unset($menu[60]);
unset($menu[65]);
unset($menu[70]);
unset($menu[75]);
unset($menu[80]);
unset($menu[99]);
// -------- Reordonează meniul după preferințe
$dashboard = $menu[2];
$separator1 = $menu[4]
$posts = $menu[5];
$books = $menu[6];
/* multiple elemente personalizate */
$authors = $menu[7];
$requests = $menu[8];
$clients = $menu[9];
$sellers = $menu[10];
$services = $menu[11];
$schedules = $menu[12];
/* lasă spațiu după */
$media = $menu[30];
$links = $menu[31];
$pages = $menu[32];
$comments = $menu[33];
$separator2 = $menu[59];
$appearance = $menu[60];
$plugins = $menu[65];
$users = $menu[70];
$tools = $menu[75];
$settings = $menu[80]
$separator3 = $menu[99];
}
add_action('admin_menu', 're_order_menu');
Funcționează bine pentru mine, deci cred că este legitim, greșesc?

Soluție foarte fragilă care se bazează pe numere magice. S-ar strica imediat ce un alt plugin este adăugat/eliminat și plasează un element între celelalte.

Am folosit 'menu_postion' => 0, 1, 2, 3, 4.
Nu contează cu adevărat. Dacă experimentezi cu ea, vei înțelege ușor cum funcționează.
Folosirea 'menu_position' => 1 ar trebui să o plaseze sub elementul de meniu Dashboard deasupra separatorului. Valoarea 0 ar trebui să o plaseze deasupra Dashboard-ului.

Acesta este un bug în WordPress. Vă rugăm să consultați acest thread în Trac: http://core.trac.wordpress.org/ticket/14755
Rezolvat în versiunea 4.4...
https://developer.wordpress.org/reference/functions/add_menu_page/#notes

Poți folosi asta:
function my_move_post () {
global $menu;
$menu[6] = $menu[5]; //mută postarea din poziția 5 în 6
unset($menu[5]); //eliberează poziția 5 ca să o poți folosi!
}
add_action('admin_menu', 'my_move_post');
Acum poți folosi poziția 5 pentru a adăuga meniul tău deasupra meniului Postări.

iată problema întregii probleme...
WordPress 4.9.2
wp-admin/menu.php:
// Dacă trebuie să folosim $_wp_last_object_menu, incrementăm mai întâi.
$ptype_menu_position = is_int( $ptype_obj->menu_position ) ? $ptype_obj->menu_position : ++$_wp_last_object_menu;
ATENȚIE: trebuie să fie un întreg și NU setat deja, altfel va merge la finalul listei.

Pentru o soluție funcțională în WordPress 5 și versiuni anterioare, repoziționați-o cu următorul cod:
add_filter('custom_menu_order', '__return_true');
add_filter('menu_order', function($menu_order) {
if (
false !== ($k1 = array_search($v1 = 'edit.php', $menu_order))
&& false !== ($k2 = array_search($v2 = 'edit.php?post_type=foo', $menu_order))
) {
array_splice($menu_order, $k1, 0, $v2);
array_splice($menu_order, $k2 + 1, 1);
}
return $menu_order;
});
Aceasta presupune că nu aveți mai mult de un element de meniu care să se lupte pentru poziția principală.

Pe același link pe care l-ai menționat, scrie:
menu_position
(integer) (opțional) Poziția în ordinea meniului unde ar trebui să apară tipul de postare.
Implicit: null - implicit va fi sub Comentarii
5 - sub Postări
10 - sub Media
20 - sub Pagini
60 - sub primul separator
100 - sub al doilea separator
Deci, dacă setezi menu_position
la o valoare precum 4
, atunci ar trebui să-l plaseze deasupra postărilor.
O poziție de -1
îl plasează deasupra link-ului Panou de control
.

Hmm. Ai încercat 1-3? Cred că poate "1" (sau "0") este Panoul de control. Poate ceva între 2-3 ar funcționa

0 1 2 3 Se afișează înaintea Panoului de control și 4 apare sub Postări. Este cu adevărat imposibil!

Cred că 4 este separatorul chiar deasupra Postărilor, iar 5 este Postări, deci dacă setezi poziția meniului la 3 va fi chiar înaintea separatorului. Cu configurația implicită, desigur. Setând pagina mea de plugin la 4 a suprascris separatorul, dar a apărut chiar deasupra Postărilor. hmmm...

Puteți utiliza valori zecimale (ca șiruri de caractere). De exemplu, am câteva tipuri de postări personalizate pe care le-am plasat la ultima poziție din meniu (100001, 100002, 100003).
Apoi, introduceți acest cod pentru a le muta deasupra elementelor de meniu Postări și sub Panou de control.
function reorder_admin_menu() {
global $menu;
// Adăugați un separator
$menu["3.1"] = array(
0 => '',
1 => 'read',
2 => 'separator_' . "anything_unique",
3 => '',
4 => 'wp-menu-separator'
);
// Am plasat elementele mele de meniu la final (exact aceste valori), așa că le mut în sus
$menu["3.2"] = $menu[100001];
$menu["3.3"] = $menu[100002];
$menu["3.4"] = $menu[100003];
unset($menu[100001]);
unset($menu[100002]);
unset($menu[100003]);
// mută elementul de meniu Media (poziția 10) în față, în același grup
$menu["3.5"] = $menu[10];
unset($menu[10]);
// Debug: ksort($menu); error_log( var_export( $menu, true ) );
}
add_action( 'admin_menu', 'reorder_admin_menu', 999 );
