Aggiungere un link arbitrario al menu di amministrazione di WordPress

30 ago 2010, 20:39:48
Visualizzazioni: 15.3K
Voti: 21

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

0
Tutte le risposte alla domanda 3
9
22

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.

9 nov 2010 19:14:48
Commenti

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

t31os t31os
10 dic 2010 01:52:33

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.

El Yobo El Yobo
13 set 2011 02:39:59

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.

mrwweb mrwweb
29 apr 2012 00:42:40

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

João João
7 nov 2012 12:44:56

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

webaware webaware
29 mag 2013 10:19:44

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

user1632018 user1632018
23 nov 2013 04:43:58

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

user1632018 user1632018
23 nov 2013 05:25:28

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.

t31os t31os
24 gen 2014 20:55:09

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

Cypher Cypher
29 dic 2022 05:13:33
Mostra i restanti 4 commenti
0
13

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:

  1. Ho scelto di usare l'istruzione switch/case nell'hook after_setup_theme / funzione redirect_from_admin_menu() in modo che fosse più semplice aggiungere ulteriori reindirizzamenti goto se necessario; basta aggiungere più istruzioni case.

  2. le funzioni wp_redirect() e wp_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!

30 ago 2010 21:46:17
0

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.

21 gen 2015 23:15:46