Aggiungere un Separatore al Menu di Amministrazione WordPress
Qualcuno sa come aggiungere un separatore al menu di amministrazione? Ho trovato questo ma non mi è stato d'aiuto.
Qualche idea?

Ecco un modo rapido e sporco per ottenere ciò che desideri.
Contesto
WordPress memorizza le sezioni del menu di amministrazione in un array globale chiamato $menu
. Per aggiungere un separatore, si aggiunge un elemento all'array $menu
utilizzando un indice che si trova tra gli indici delle opzioni che si desidera separare.
Utilizzo della funzione add_admin_menu_separator()
Ho scritto una funzione per incapsulare questa logica, chiamata add_admin_menu_separator()
. Dovrai scegliere un numero di indice dell'array che sia maggiore dell'opzione dopo la quale vuoi aggiungere un separatore, e poi chiamare la funzione add_admin_menu_separator()
passando detto indice come parametro.
Ad esempio:
add_admin_menu_separator(37);
La funzione add_admin_menu_separator()
stessa
Ecco la definizione della funzione add_admin_menu_separator()
che puoi copiare nel file functions.php
del tuo tema. Sì, è arcana, ma lo è anche il codice che crea e utilizza l'array globale $menu
. (Si prevede di deprecarlo eventualmente, per fortuna, ma probabilmente ci vorranno ancora alcuni anni.)
function add_admin_menu_separator($position) {
global $menu;
$index = 0;
foreach($menu as $offset => $section) {
if (substr($section[2],0,9)=='separator')
$index++;
if ($offset>=$position) {
$menu[$position] = array('','read',"separator{$index}",'','wp-menu-separator');
break;
}
}
ksort( $menu );
}
Trovare l'indice necessario nell'array $menu
Per capire quale numero di indice ti serve, puoi fare un var_dump()
di $GLOBALS['menu']
all'interno di un hook admin_init
. Ecco un pezzo di codice che puoi inserire temporaneamente nel file functions.php
del tuo tema per vedere quali sono i valori. Funzionerà solo quando si richiede un URL che inizia con /wp-admin/
(ma assicurati di farlo con FTP e non con l'editor di temi integrato, altrimenti perderai l'accesso al tuo sito, almeno finché non avrai accesso FTP al file functions.php
del tuo tema!):
add_action('admin_init','dump_admin_menu');
function dump_admin_menu() {
if (is_admin()) {
header('Content-Type:text/plain');
var_dump($GLOBALS['menu']);
exit;
}
}
Vedi anche:
BTW, potresti trovare utili questi link in generale per lavorare con i menu di amministrazione:
Anche se le mie classi del menu di amministrazione al momento non offrono un modo semplice per aggiungere separatori, penso che ora aggiungerò questa funzionalità quando avrò tempo.

Grazie Mike, ho passato tutta la notte a studiare la variabile globale del menu, ma non sono riuscito ad aggiungere un separatore. Ora mi è molto più chiaro come funzionano i menu in WordPress.

Ciao @user1147: Sì, sono veramente difficili da capire. La prima volta che ho dovuto farlo mi ci è voluto moltissimo tempo, e ancora ho difficoltà. Ecco perché ho scritto quelle funzioni, così posso farlo in modo più semplice d'ora in poi! Comunque, sono contento che la mia risposta ti sia stata utile.

@MikeSchinkel Questo metodo non funziona per me con WordPress 3.3.1.

L'ho appena testato e "funziona" in 4.5, ma WordPress ha deciso di eliminare le righe quindi semplicemente non compaiono più. Penso che la soluzione sia aggiungere del CSS ma per quanto mi sforzi non riesco a capire quale CSS aggiungere dato che sono uno sviluppatore backend e faccio schifo con il CSS. Forse qualcun altro può suggerire?

@MikeSchinkel quel bug è stato ora risolto. Il codice suggerito imposterebbe il separatore nell'indice specificato, ma se aggiungiamo del rumore casuale all'indice non verrà sostituito — perché 37.4345
non è 37
:)

È semplice come:
add_action( 'admin_init', 'add_sep' );
function add_sep() {
if ( ! is_admin() )
return false;
global $menu;
$sep = $menu[4]; // questo è il separatore predefinito
$pos = 6; // modificalo per la posizione desiderata
$menu = array_merge(
array_slice( $menu, 0, $pos ),
array( $sep ),
array_slice( $menu, $pos + 1, -1)
);
$menu[ $pos - 1 ][4] .= ' menu-top-last';
$menu[ $pos + 1 ][4] .= ' menu-top-first';
}
Nota: La posizione predefinita del separatore ($menu[4]
) può essere diversa a seconda della configurazione che tu (o i tuoi plugin) hai effettuato prima di questo hook.
Ovviamente, puoi anche modificare le classi menu-top-first
e menu-top-last
tramite introspezione.

Puoi semplicemente aggiungere questo nel file functions.php
add_action('admin_menu', function () {
global $menu;
$menu[49] = ['', 'read', '', '', 'wp-menu-separator'];
});
Dove 49 è la posizione del separatore. Devi ricordare che la posizione del separatore può sovrascrivere un elemento del menu se ha la stessa posizione.

Questo si basa sulla risposta di MastaBaba, ma non sostituisce nulla nella posizione specificata - aggiunge semplicemente il separatore successivamente.
Utilizza anche una funzione anonima, quindi è compatibile solo con PHP versione 5.3 e successive.
add_action( 'admin_menu', function () {
$position = 29;
global $menu;
$separator = [
0 => '',
1 => 'read',
2 => 'separator' . $position,
3 => '',
4 => 'wp-menu-separator'
];
if (isset($menu[$position])) {
$menu = array_splice($menu, $position, 0, $separator);
} else {
$menu[$position] = $separator;
}
});

È un po' difficile capire esattamente cosa stai cercando di fare, ma credo che tu voglia aggiungere una voce di primo livello nel menu di amministrazione di WordPress.
Consulta questa documentazione nel Codex di WordPress.
In breve, stai cercando di utilizzare la funzione add_menu_page()
, che accetta diversi argomenti e mostra una voce aggiuntiva nel menu amministrativo come elemento allo stesso livello di "Bacheca", "Articoli", "Media", ecc.
Spero di aver capito bene. :-)

Il codice seguente aggiunge un'azione a WordPress che viene eseguita quando viene renderizzato il menu di amministrazione. Il menu di amministrazione è un array e tutto ciò che stai facendo, qui, è aggiungere un elemento dell'array che definisce un separatore, nella posizione che specifichi.
Da qui:
add_action( 'admin_menu', 'set_admin_menu_separator' );
function set_admin_menu_separator() {
$position = 79;
global $menu;
$menu[$position] = array(
0 => '',
1 => 'read',
2 => 'separator' . $position,
3 => '',
4 => 'wp-menu-separator'
);
}
Nota che, sebbene questo assomigli piuttosto alla risposta attualmente accettata, quella risposta non ha funzionato per me (e, a giudicare dai commenti, per molti altri).
