Aggiungere un link arbitrario al menu di amministrazione di WordPress
È possibile aggiungere un collegamento ipertestuale arbitrario al menu di amministrazione di WordPress (il menu a sinistra quando si accede alla dashboard di amministrazione)? Ad esempio, si può aggiungere un link a Google?
Nel mio caso specifico, vorrei aggiungere una pagina di stileguide per un tema WordPress su cui sto lavorando, per mostrare all'utente come vengono stilizzati i diversi elementi HTML con il tema e per dimostrare come stilizzare al meglio vari elementi.
Questo è il codice che ho finora (nota: è incompleto): In functions.php ho aggiunto una nuova voce di menu nella sezione Aspetto:
add_action('admin_menu', 'create_theme_style_page');
function create_theme_style_page() {
add_theme_page('Guida di stile del tema', 'Guida di stile', 'administrator', basename(__FILE__),'build_styleguide_page');
}
function build_styleguide_page() {
echo "Non sono sicuro di cosa mettere qui per reindirizzare l'amministratore a un URL arbitrario?";
}
In build_styleguide_page()
, il tentativo di reindirizzare con header()
genera un errore (Cannot modify header information).

Se aggiungi il tuo elemento al menu inserendolo direttamente nell'array $submenu
, eviterai la necessità di fare il reindirizzamento e potrai utilizzare un URL esterno completo come link del menu (io stesso lo faccio).
add_action( 'admin_menu' , 'admin_menu_new_items' );
function admin_menu_new_items() {
global $submenu;
$submenu['index.php'][500] = array( 'Nome elemento menu', 'manage_options' , 'http://example.com' );
}
index.php
rappresenta la chiave/link del menu genitore, quindi nell'esempio sto sostanzialmente aggiungendo un elemento al menu Dashboard..
Certo, non è elegante come usare le funzioni add_{type}_page
, ma aggira il fatto che WordPress impedisce gli URL esterni nei link del menu di amministrazione..
Uso qualcosa di simile per aggiungere i miei vari host virtuali nel menu, così posso passare ad altre installazioni direttamente dal menu di amministrazione (tutto fatto con uno script, ma sostanzialmente utilizza una versione migliorata del codice sopra).
NOTA: Se decidi di usare il codice, fai attenzione a non assegnare una chiave già in uso (la chiave dell'array 500 nel codice di esempio).
SUGGERIMENTO: Puoi effettivamente usare anche valori negativi nelle chiavi del menu, così puoi forzare i tuoi elementi del menu a posizionarsi prima di qualsiasi elemento nativo di WordPress.

NOTA: Penso che dovrai impostare quella chiave negativa come stringa, cioè '-5'
e non -5
, altrimenti la chiave viene considerata non valida (credo).. (le stringhe negative funzionano però, se non mi sbaglio)..

Grazie, peccato che non si possa fare con le funzioni reali, ma questa soluzione è molto meglio che dover aggiungere un hook/redirect combo solo per avere un link.

Questa risposta in particolare mi ha aiutato con il mio plugin Post Status Menu Items (puoi probabilmente immaginare cosa fa). Comunque, dato che non sapevo quali altri plugin avrebbero aggiunto elementi ai menu, ho pensato di aggiungere che ho usato array_push()
per aggiungere gli elementi del menu in coda ed evitare collisioni con altri plugin.

Funziona perfettamente, in più merita un punto extra per l'uso di un frammento di codice così piccolo.

+1. Invece di scegliere una chiave a caso, è meglio prendere l'ultima chiave e incrementarla. Ad esempio, quando si aggiunge una voce al sottomenu del menu Strumenti: global $submenu; $key = end(array_keys($submenu['tools.php'])) + 1; $submenu['tools.php'][$key++] =
ecc.

Grazie mille :) Ho provato sia con Jquery che con la redirezione e ho avuto problemi. Questa soluzione è perfetta.

Ho però una domanda, come potrei aggiungere un altro link? Ho provato a usare un array multidimensionale, ma non è consentito.

Ho volutamente evitato l'approccio con incremento perché non posso sempre dire che voglio aggiungere o anteporre l'indice, né la domanda aveva quel requisito, ma sarebbe una scelta intelligente se volessi aggiungere elementi al menu in modo programmatico.

Per aprire il link in una nuova scheda / nuova pagina (target="_blank"), leggi questo: https://stackoverflow.com/questions/23036664/how-to-open-target-blank-in-a-custom-admin-sub-menu-page

Ciao @Tom,
Se ho capito correttamente la tua domanda, non hai tanto bisogno di sapere come aggiungere un link al menu (sembra che tu lo sappia già) ma piuttosto hai bisogno di imparare come fare in modo che il tuo link reindirizzi correttamente, giusto?
Reindirizzare a un URL Esterno da una Voce di Menu nell'Area di Amministrazione
Se è così, quello che devi fare è non usare la funzione della voce di menu ma invece "agganciare" WordPress abbastanza presto in modo che non abbia ancora inviato alcun output a parte eventualmente gli header HTTP. L'hook più precoce quando si chiama /wp-admin/themes.php
sembra essere after_setup_theme
e funziona bene.
Usa uno "Slug del Menu" per Poterlo Testare in un Hook
Ma per farlo funzionare, dobbiamo prima modificare la tua chiamata a add_theme_page
nell'hook admin_menu
/ la tua funzione create_theme_style_page()
. Abbiamo eliminato il quinto parametro (la funzione da chiamare per implementare l'opzione di amministrazione) perché non ci serve, e abbiamo cambiato il quarto parametro (lo "slug del menu") in themes.php?goto=build-styleguide-page
.
Anche se avremmo potuto scegliere praticamente qualsiasi cosa per il quarto parametro, dato che stiamo per reindirizzare, ho indirizzato alla stessa pagina (themes.php
) delle altre opzioni di aspetto per coerenza. Ho anche arbitrariamente scelto il nome goto
perché WordPress non lo usa e sembra avere senso in questo contesto.
add_action('admin_menu', 'create_theme_style_page');
function create_theme_style_page() {
add_theme_page(
'Guida di Stile del Tema',
'Guida di Stile del Tema',
'administrator',
'themes.php?goto=build-styleguide-page'
);
}
BTW, abbiamo eliminato la tua funzione build_styleguide_page()
perché non ci serve per questa soluzione.
Reindirizzamento nell'Hook più Precoce per themes.php
: after_setup_theme
Come ultimo pezzo di codice, implementiamo il nostro hook after_setup_theme
nella nostra funzione redirect_from_admin_menu()
. Facciamo in modo che verifichi se la pagina corrente è themes.php
e che assicuri che un parametro URL di goto
sia stato passato nell'URL. Poi testa il valore di goto
usando un'istruzione switch
/case
per vedere se ha un valore di 'build-styleguide-page'
; se è così, reindirizza al tuo esempio ipotetico, ad esempio Google, altrimenti reindirizziamo semplicemente alla dashboard di amministrazione:
add_action('after_setup_theme', 'redirect_from_admin_menu');
function redirect_from_admin_menu($value) {
global $pagenow;
if ($pagenow=='themes.php' && !empty($_GET['goto'])) {
switch ($_GET['goto']) {
case 'build-styleguide-page':
wp_redirect("http://www.google.com");
break;
default:
wp_safe_redirect('/wp-admin/');
break;
}
exit;
}
}
Note:
Ho scelto di usare l'istruzione
switch
/case
nell'hookafter_setup_theme
/ funzioneredirect_from_admin_menu()
in modo che fosse più semplice aggiungere ulteriori reindirizzamentigoto
se necessario; basta aggiungere più istruzioni case.le funzioni
wp_redirect()
ewp_safe_redirect()
non terminano effettivamente; devi emettere esplicitamente un'istruzione exit per far sì che WordPress si fermi e non sovrascriva il tuo reindirizzamento.
Spero che questo ti aiuti!

Ho ottenuto lo stesso risultato con questo:
function add_custom_menu_item(){
add_menu_page( 'Menu Item Title', 'Page Title', 'manage_options', 'page_slug', 'function', 'dashicons-icon', 1 );
}
add_action( 'admin_menu', 'add_custom_menu_item' );
function custom_menu_item_redirect() {
$menu_redirect = isset($_GET['page']) ? $_GET['page'] : false;
if($menu_redirect == 'page_slug' ) {
wp_safe_redirect( home_url('/my-page') );
exit();
}
}
add_action( 'admin_init', 'custom_menu_item_redirect', 1 );
Quello che fai qui è aggiungere una voce di menu e definire lo slug, poi su 'admin_init' controlli se lo slug esiste e reindirizzi alla posizione desiderata.
