Posizionare un Menu di Tipo di Post Personalizzato Sopra il Menu Post Usando menu_position
Ho appena scoperto il parametro menu_position e sembra che si possa posizionare il menu del tipo di post personalizzato quasi ovunque. Tranne che sopra il menu Post!
Come posso ottenere questo risultato?
Posizioni per le voci di menu principali
- 2 Dashboard
- 4 Separatore
- 5 Articoli
- 10 Media
- 15 Collegamenti
- 20 Pagine
- 25 Commenti
- 59 Separatore
- 60 Aspetto
- 65 Plugin
- 70 Utenti
- 75 Strumenti
- 80 Impostazioni
- 99 Separatore
Descrizione del parametro per "posizione menu"
$position
(integer) (opzionale) La posizione nell'ordine del menu dove questa voce dovrebbe apparire. Di default, se questo parametro è omesso, la voce apparirà in fondo alla struttura del menu. Più alto è il numero, più in basso sarà la sua posizione nel menu.ATTENZIONE: se due voci di menu usano lo stesso attributo di posizione, una delle voci potrebbe essere sovrascritta così che solo una voce viene visualizzata! Il rischio di conflitto può essere ridotto usando valori decimali invece di interi, es. 63.3 invece di 63.
Default: fondo della struttura del menu

Il nuovo plugin JetPack posiziona il suo collegamento di menu immediatamente sotto il collegamento alla Dashboard. Lo fa impostando l'ordine del menu a 0, filtrando l'array $menu_order:
function jetpack_menu_order( $menu_order ) {
$jp_menu_order = array();
foreach ( $menu_order as $index => $item ) {
if ( $item != 'jetpack' )
$jp_menu_order[] = $item;
if ( $index == 0 )
$jp_menu_order[] = 'jetpack';
}
return $jp_menu_order;
}
Per curiosità, cosa succederebbe se provassi a usare 0 come menu_position?

Stavo cercando una soluzione sul web ma non ho trovato nulla. Ecco un semplice trucco (ad esempio). Qui hai la lista nativa delle posizioni:
- 2 Dashboard
- 4 Separatore
- 5 Articoli
- 10 Media
- 15 Link
- 20 Pagine
- 25 Commenti
- 59 Separatore
- 60 Aspetto
- 65 Plugin
- 70 Utenti
- 75 Strumenti
- 80 Impostazioni
- 99 Separatore
Se hai più elementi, puoi leggere la posizione corrente per ogni elemento stampando la variabile globale $menu:
global $menu;
print_r($menu);
Quindi, se ho capito bene, nulla ci impedisce di riordinare il menu come vogliamo:
function re_order_menu () {
// ------- Sposta gli elementi
$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];
// -------- Resetta il menu
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]);
// -------- Riordina il menu come preferisci
$dashboard = $menu[2];
$separator1 = $menu[4];
$posts = $menu[5];
$books = $menu[6];
/* i miei numerosi elementi personalizzati */
$authors = $menu[7];
$requests = $menu[8];
$clients = $menu[9];
$sellers = $menu[10];
$services = $menu[11];
$schedules = $menu[12];
/* lascia un po' di spazio dopo */
$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');
Funziona bene per me, quindi penso che sia legittimo, mi sbaglio?

Soluzione molto fragile che si basa su numeri magici. Smetterebbe di funzionare non appena viene aggiunto/rimosso un altro plugin che inserisce un elemento tra gli altri.

Ho utilizzato 'menu_position' => 0, 1, 2, 3, 4.
In realtà non ha molta importanza. Se ci giochi un po', puoi capirlo facilmente.
Usare 'menu_position' => 1 dovrebbe posizionarlo sotto la voce del menu Dashboard sopra il separatore. 0 dovrebbe posizionarlo sopra la Dashboard

Questo è un bug in WordPress. Si prega di vedere questa discussione in Trac: http://core.trac.wordpress.org/ticket/14755
Risolto nella versione 4.4...
https://developer.wordpress.org/reference/functions/add_menu_page/#note

Puoi utilizzare questo codice:
function my_move_post () {
global $menu;
$menu[6] = $menu[5]; //sposta il post dalla posizione 5 alla 6
unset($menu[5]); //libera la posizione 5 così puoi usarla!
}
add_action('admin_menu', 'my_move_post');
Ora puoi utilizzare la posizione 5 per aggiungere il tuo menu sopra al menu Articoli.

ecco l'avvertenza sull'intera questione...
WordPress 4.9.2
wp-admin/menu.php:
// Se dobbiamo usare $_wp_last_object_menu, incrementiamolo prima.
$ptype_menu_position = is_int( $ptype_obj->menu_position ) ? $ptype_obj->menu_position : ++$_wp_last_object_menu;
NOTA: deve essere un numero intero e NON già impostato, altrimenti va in fondo alla lista.

Per una soluzione funzionante in WordPress 5 e versioni precedenti, riposiziona il menu con il seguente codice:
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;
});
Questo presuppone che non ci sia più di una voce di menu che cerca di posizionarsi in prima posizione.

Sul link che hai fornito, si legge:
menu_position
(integer) (opzionale) La posizione nell'ordine del menu in cui dovrebbe apparire il post type.
Valore predefinito: null - di default viene posizionato sotto Commenti
5 - sotto Articoli
10 - sotto Media
20 - sotto Pagine
60 - sotto il primo separatore
100 - sotto il secondo separatore
Quindi, se imposti menu_position
a un valore come 4
, dovrebbe posizionarlo sopra gli Articoli.
Una posizione di -1
lo posiziona sopra il link Dashboard
.

Hmm. Hai provato 1-3? Penso che forse "1" (o "0") sia la Dashboard. Forse qualcosa tra 2-3 potrebbe funzionare

0 1 2 3 Vanno prima della Dashboard e 4 va sotto Post. È davvero impossibile!

Penso che il 4 sia il separatore appena sopra Articoli, e il 5 sia Articoli, quindi se imposti la tua menu-position a 3 sarà appena prima del separatore. Con la configurazione predefinita ovviamente. Impostando la pagina del mio plugin a 4 ho sovrascritto il separatore, ma è apparso appena sopra Articoli. hmmm...

Puoi utilizzare valori decimali (come stringhe). Ad esempio, ho alcuni tipi di post personalizzati che ho posizionato all'ultima posizione nel menu (100001, 100002, 100003).
Quindi, inserisci questo codice per spostarli sopra le Voci e sotto la voce del menu Bacheca.
function reorder_admin_menu() {
global $menu;
// Aggiungi un separatore
$menu["3.1"] = array(
0 => '',
1 => 'read',
2 => 'separator_' . "anything_unique",
3 => '',
4 => 'wp-menu-separator'
);
// Ho posizionato le mie voci di menu alla fine (esattamente questi valori), quindi le sposto più in alto
$menu["3.2"] = $menu[100001];
$menu["3.3"] = $menu[100002];
$menu["3.4"] = $menu[100003];
unset($menu[100001]);
unset($menu[100002]);
unset($menu[100003]);
// Sposta la voce del menu Media (posizione 10) all'inizio, nello stesso gruppo
$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 );
