Aggiungere un Separatore al Menu di Amministrazione WordPress

6 ott 2010, 23:02:41
Visualizzazioni: 27K
Voti: 27

Qualcuno sa come aggiungere un separatore al menu di amministrazione? Ho trovato questo ma non mi è stato d'aiuto.

Qualche idea?

1
Commenti

Nel caso qualcuno stia ancora cercando la risposta a questo, questo plugin può gestire il lavoro.

user31760 user31760
2 mag 2013 14:43:53
Tutte le risposte alla domanda 7
8
40

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.

7 ott 2010 05:00:18
Commenti

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.

user1147 user1147
7 ott 2010 19:53:51

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 MikeSchinkel
7 ott 2010 20:39:50

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

Jim Geurts Jim Geurts
10 gen 2012 00:49:38

@JimGeurts - non funziona neanche per me :/

Evan Mattson Evan Mattson
24 apr 2012 20:56:01

Sembra che non funzioni più.

MastaBaba MastaBaba
19 giu 2016 16:43:17

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 MikeSchinkel
23 giu 2016 04:23:41

@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 :)

fregante fregante
1 feb 2018 17:46:41

Query Monitor mostra un errore PHP via AJAX nella funzione add_admin_menu_separator, e sembra sia perché $menu non esiste per le richieste REST API. Racchiudendo tutto dopo il global $menu in un if (!empty($menu)) { } sembra risolvere il problema.

cbirdsong cbirdsong
26 gen 2022 16:37:03
Mostra i restanti 3 commenti
0

È 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.

19 set 2012 16:06:52
0

Ho avuto alcuni problemi con i separatori che non venivano aggiunti, a causa del modo in cui WordPress rimuove i separatori duplicati. Aggiungere ksort($menu); alla fine della funzione ha risolto il problema.

18 nov 2010 05:15:37
0

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.

7 ago 2020 09:45:55
0

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;
    }
});
8 mag 2018 15:44:07
2

È 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. :-)

6 ott 2010 23:32:00
Commenti

Sto solo cercando di aggiungere un separatore al menu di amministrazione. Prima di pubblicare la domanda ho provato a usare add_menu_page().

user1147 user1147
6 ott 2010 23:56:09

Sembra che MikeSchinkel ti abbia coperto abbastanza bene. Scusa per l'incomprensione. Buona fortuna!

dgw dgw
7 ott 2010 23:41:22
2

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).

19 giu 2016 16:57:35
Commenti

Non c'è differenza rispetto alla risposta esistente e accettata, tranne per il fatto che non fornisci alcuna spiegazione. Per favore leggi [risposta].

fuxia fuxia
19 giu 2016 18:19:31

@toscho: Beh, questo funziona per me e la risposta accettata no.

MastaBaba MastaBaba
19 giu 2016 20:22:19