Aggiunta di un collegamento arbitrario al menu Admin?


20

C'è un modo per aggiungere un collegamento ipertestuale arbitrario al menu di amministrazione di WordPress (intendo il menu a sinistra quando accedi al pannello di amministrazione)? Ad esempio, è possibile aggiungere un collegamento a Google?

Nel mio caso particolare, vorrei aggiungere una pagina di styleguide per un tema Wordpress su cui sto lavorando in modo da poter mostrare all'utente come diversi elementi HTML sono stati disegnati con il tema e dimostrare come modellare bene varie cose.

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('Theme Styleguide', 'Theme Styleguide', 'administrator', basename(__FILE__),'build_styleguide_page');
}

function build_styleguide_page() {
 echo "Not sure what goes here to redirect admin to a arbitrary url?";
}

In build_styleguide_page(), il tentativo di reindirizzare con header()genera un errore ( Impossibile modificare le informazioni dell'intestazione ).

Risposte:


13

Ciao @ Tom ,

Se capisco correttamente la tua domanda non devi sapere come aggiungere un link al menu (sembra che tu lo sappia già) ma invece devi imparare come far reindirizzare correttamente il tuo link, giusto?

Reindirizzamento a un URL esterno da una voce del menu Amministratore

In questo caso, ciò che devi fare è non utilizzare la funzione di voce di menu ma "agganciare" WordPress abbastanza presto in modo tale che non abbia prodotto nulla tranne le intestazioni HTTP. Il primo hook quando si chiama /wp-admin/themes.phpsembra essere after_setup_themee sembra funzionare bene.

Usa un "Menu Slug" in modo da poterlo testare in un gancio

Ma per farlo funzionare dobbiamo prima modificare la tua chiamata add_theme_pagein admin_menuhook / la tua create_theme_style_page()funzione. Abbiamo abbandonato il quinto parametro (la funzione da chiamare per implementare l'opzione admin) perché non ne abbiamo bisogno e abbiamo modificato il quarto parametro (il "menu slug" ) themes.php?goto=build-styleguide-page.

Sebbene avremmo potuto scegliere quasi letteralmente qualsiasi cosa per il quarto parametro, dato che reindirizzeremo ho indirizzato alla stessa pagina ( themes.php) di altre opzioni di aspetto per coerenza. Ho anche solo arbitrariamente inventato il nome gotoperché WordPress non lo usa e sembra avere senso per questo.

add_action('admin_menu', 'create_theme_style_page');
function create_theme_style_page() {
  add_theme_page(
    'Theme Styleguide',
    'Theme Styleguide',
    'administrator',
    'themes.php?goto=build-styleguide-page'
  );
}

A proposito, ci siamo sbarazzati della tua build_styleguide_page()funzione perché non ne abbiamo bisogno per questa soluzione.

Reindirizza nel primo hook per themes.php:after_setup_theme

Come ultimo bit di codice implementiamo il nostro after_setup_themehook nella nostra redirect_from_admin_menu()funzione. Abbiamo test per vedere se la pagina corrente è themes.phpe per garantire che un parametro URL sia gotostato passato sull'URL. Quindi verifica il valore gotodell'uso di un'istruzione switch/ caseper vedere se ha un valore di 'build-styleguide-page'; in tal caso reindirizza all'ipotetico dichiarato, ad esempio Google, altrimenti reindirizziamo 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;
  }
}

Gli appunti:

  1. Ho scelto di usare l' istruzione switch/ casenella funzione after_setup_themehook / in redirect_from_admin_menu()modo che sarebbe più facile aggiungere ulteriori gotoreindirizzamenti se necessario; aggiungi solo altri casi.

  2. le funzioni wp_redirect()e wp_safe_redirect()non terminano effettivamente; è necessario emettere esplicitamente un'istruzione di uscita per arrestare WordPress e non sovrascrivere il reindirizzamento.

Spero che sia di aiuto!


22

Se aggiungi l'elemento nel menu aggiungendolo $submenudirettamente all'array, eviterai la necessità di eseguire il reindirizzamento e di essere in grado di utilizzare un URL completo fuori sede come collegamento al menu (lo faccio da solo).

add_action( 'admin_menu' , 'admin_menu_new_items' );
function admin_menu_new_items() {
    global $submenu;
    $submenu['index.php'][500] = array( 'Menu item name', 'manage_options' , 'http://example.com' ); 
}  

index.phprappresenta la chiave / collegamento del menu principale, quindi nell'esempio sto fondamentalmente aggiungendo una voce al menu Dashboard .

Certo, non è così carino come usare le add_{type}_pagefunzioni, ma aggira il fatto che WordPress impedisce gli URL fuori sito nei collegamenti 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 admin (tutto fatto con uno script, ma fondamentalmente usa una versione glorificata del codice sopra).

NOTA: se si decide di utilizzare il codice, fare attenzione a non assegnare una chiave in uso (la chiave dell'array 500 nel codice di esempio).

SUGGERIMENTO: puoi effettivamente utilizzare valori negativi nei tasti del menu per, quindi puoi forzare le voci del menu a sedere prima di una qualsiasi delle voci native di WordPress.


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

Grazie, fa schifo che non puoi farlo con le funzioni reali, ma è molto meglio che dover aggiungere una combinazione hook / reindirizzamento solo per avere un link.
El Yobo,

2
Questa particolare risposta mi ha aiutato con le voci del mio menu Post Status del plugin (probabilmente puoi indovinare cosa fa). Comunque, poiché non sapevo quali altri plugin avrebbero aggiunto elementi a quali menu, ho pensato di aggiungere semplicemente che array_push()aggiungevo le voci di menu per evitare di scontrarmi con altri plugin.
mrwweb,

Funziona come un incantesimo, oltre a un punto bonus per l'utilizzo di un frammento così piccolo.
João,

2
+1. Invece di scegliere una chiave e sperare, basta prendere l'ultima chiave e incrementare. Ad esempio, quando si aggiunge un sottomenu al menu Strumenti: global $submenu; $key = end(array_keys($submenu['tools.php'])) + 1; $submenu['tools.php'][$key++] = ecc.
webaware,

3

Ho raggiunto lo stesso 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 la voce di menu e definire la lumaca, quindi su 'admin_init' controlli se la lumaca esiste e reindirizza verso la posizione desiderata.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.