Aggiungere menu e sottomenu nell'admin con URL invece dello slug?
Uso questa funzione e hook:
function mysite_admin_menu()
{
add_menu_page( 'Categories', 'Categorie', 'administrator', 'categories', 'a_function' );
add_submenu_page( 'categories', 'Manage', 'Gestisci', 'administrator', 'xxx', 'a_function' );
remove_submenu_page('categories','categories');
}
add_action( 'admin_menu', 'mysite_admin_menu' );
Visualizza quello che mi serve: un menu con un sottomenu nella barra del menu amministrativo di sinistra.
Il problema è che il sottomenu porta a questa pagina: admin.php?page=xxx
.
Come posso fare per collegarlo a un URL come edit-tags.php?taxonomy=category
?
Se sostituisco lo slug nel add_submenu_page
con un URL relativo, il link porterà a
admin.php?page=edit-tags.php?taxonomy=category
.
Qualunque cosa io faccia, ottengo sempre admin.php?page=...
che non è quello che voglio.

Questo è un vecchio post, ma non potresti semplicemente usare le variabili globali di WordPress $menu
e/o $submenu
come ha suggerito Oleg al punto 2.
Quando sei in dubbio, copia WordPress:
Ad esempio, per aggiungere un link sembra che questo potrebbe funzionare:
function add_external_link_admin_submenu() {
global $submenu;
$permalink = admin_url( 'edit-tags.php' ).'?taxonomy=category';
$submenu['options-general.php'][] = array( 'Gestisci', 'manage_options', $permalink );
}
add_action('admin_menu', 'add_external_link_admin_submenu');
Puoi sostituire $permalink = ...
con qualsiasi cosa
Quindi anche questo dovrebbe funzionare:
$permalink = 'http://www.example.com';
Inoltre, si suggerisce di non usare 'administrator' (anche se lo uso anch'io). Comunque, leggi questo ticket per soluzioni alternative.

Non ti consiglio di farlo.
Supponiamo che il tuo prefisso per admin.php
sia _trigger_me_
Sottomenu
<?php function _clean_url_to_repalce_admin_menu($url, $original_url, $_context){ if ($url == 'admin.php?page=_trigger_me_'){ remove_filter('clean_url', '_clean_url_to_repalce_admin_menu', 10); //return admin_url('someotherpage.php); return 'http://google.com/'; } } if (is_admin()) add_filter('clean_url', '_clean_url_to_repalce_admin_menu', 10, 3);
Menu Principale
<?php function custom_admin_menu_action_hook(){ global $menu; foreach($menu as $k=>$item){ if ($item[2] == '_trigger_me_'){ $menu[$k][2] = 'http://google.com'; } } } add_action('admin_menu', 'custom_admin_menu_action_hook', 100);
Chiamo entrambi gli esempi "hack". Sono possibili da fare, ma è meglio evitarli.
Aggiornamento.
Nel caso in cui ti accontenti di un reindirizzamento =)
<?php
$hook = add_submenu_page($parent, $title, $menu_title, 'manage_option', 'callback');
add_action("load-{$hook}", create_function('','
header("Location:", admin_url("someurl.php?blahblahblah"));
exit;
'));
Nel caso in cui tu voglia sostituirlo con una pagina di tassonomia (edit-tags.php
)
<?php
add_action('admin_menu', 'admin_menu_edit_tags_page');
function admin_menu_edit_tags_page(){
// imposta $YOURPARENTSLUG come slug genitore del tuo elemento di menu (genitore del tuo menu)
// manage_tags a manage_terms della capability della tua tassonomia (è visibile quando fai var_dump($wp_taxonomies[$taxonomyyouwant]));
add_submenu_page($YOURPARENTSLUG, 'menu', 'title', 'manage_tags', 'edit-tags.php?taxonomy=taxonomy');
}

Se il tuo sottomenu manca del prefisso admin.php?page=
, dovresti prima registrare il menu genitore e poi il sottomenu.
add_action( 'admin_menu', function() {
// Prima il menu genitore
add_menu_page( 'Titolo della pagina', 'Titolo del Menu', 'capability', 'parent-slug', 'callback' );
// Poi i sottomenu
add_submenu_page( 'parent-slug', 'Titolo della pagina del sottomenu', 'Titolo del sottomenu', 'capability', 'slug', 'callback' );
} );
Altrimenti il link sarà semplicemente lo slug.

Grazie Oleg, il tuo script funziona ma interrompe l'interfaccia di amministrazione (i colori di sfondo e le immagini scompaiono tutti per qualche motivo).
Ma se devo seguire questa strada, posso fare invece questo:
function changeUrl()
{
$pageURL = 'http://'.$_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
if ($pageURL == 'http://www.mysite.com/wp-admin/admin.php?page=xxxx')
{
header ('location:http://www.mysite.com/wp-admin/edit-tags.php?taxonomy=category');
}
}
add_action( 'admin_menu', 'changeUrl' );
Mi sembra curioso che non ci sia un modo semplice per collegare un sottomenu a qualsiasi URL. Questo tipo di reindirizzamento è confusionario... ma funziona.

Anche se si tratta di un problema datato, vorrei contribuire con questo codice per la vostra considerazione:
function mysite_admin_menu()
{
// Aggiunge un menu principale "Categories" nell'area di amministrazione
add_menu_page( 'Categories', 'Categorie', 'administrator', 'categories', 'a_function' );
// Aggiunge un sottomenu "Manage" sotto "Categories"
add_submenu_page( 'categories', 'Manage', 'Gestisci', 'administrator', 'manage_categories', 'mysite_manage_categories' );
// Rimuove il collegamento al menu principale che punta a se stesso
remove_submenu_page('categories','categories');
}
// Registra la funzione durante l'hook admin_menu
add_action( 'admin_menu', 'mysite_admin_menu' );
function mysite_manage_categories()
{
// Reindirizza alla pagina di gestione delle categorie di WordPress
?><script>window.location = "<?php echo admin_url('edit-tags.php?taxonomy=category'); ?>";</script><?php
}
Utilizza un reindirizzamento JavaScript invece di creare un altro add_action per il reindirizzamento HTTP.
