¿Añadir menú y submenú en el admin con una URL en lugar de slug?
Uso esta función y hook:
function mysite_admin_menu()
{
add_menu_page( 'Categories', 'Categorías', 'administrator', 'categories', 'a_function' );
add_submenu_page( 'categories', 'Manage', 'Gestionar', 'administrator', 'xxx', 'a_function' );
remove_submenu_page('categories','categories');
}
add_action( 'admin_menu', 'mysite_admin_menu' );
Muestra lo que necesito: un menú con un submenú en la barra de menú del administrador.
El problema es que el submenú lleva a esta página: admin.php?page=xxx
.
¿Cómo puedo hacer para enlazar a una URL como edit-tags.php?taxonomy=category
?
Si cambio el slug en el add_submenu_page
por una URL relativa, el enlace llevará a
admin.php?page=edit-tags.php?taxonomy=category
.
Haga lo que haga, siempre obtengo admin.php?page=...
que no es lo que quiero.

Esta es una publicación antigua, pero ¿no podrías simplemente usar las variables globales de WordPress $menu
y/o $submenu
como sugirió Oleg en el punto número 2?
Cuando tengas dudas, copia a WordPress:
Por ejemplo, para añadir un enlace, esto parece que funcionaría:
function add_external_link_admin_submenu() {
global $submenu;
$permalink = admin_url( 'edit-tags.php' ).'?taxonomy=category';
$submenu['options-general.php'][] = array( 'Manage', 'manage_options', $permalink );
}
add_action('admin_menu', 'add_external_link_admin_submenu');
Puedes reemplazar el $permalink = ...
con cualquier cosa
Así que esto también debería funcionar:
$permalink = 'http://www.example.com';
Además, se sugiere no usar 'administrator' (aunque yo también lo uso). En cualquier caso, lee este ticket para ver soluciones alternativas.

No te recomiendo que hagas eso.
Supongamos que tu prefijo para admin.php
es _trigger_me_
Submenú
<?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);
Menú Principal
<?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);
Llamo a ambos ejemplos como "hacks". Son posibles de hacer, pero mejor no hacerlos.
Actualización.
En caso de que estés satisfecho con la redirección =)
<?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;
'));
En caso de que quieras sustituir esto por la página de taxonomía (edit-tags.php
)
<?php
add_action('admin_menu', 'admin_menu_edit_tags_page');
function admin_menu_edit_tags_page(){
// por favor establece $YOURPARENTSLUG como el slug padre de tu elemento de menú (padre de tu menú)
// manage_tags a manage_terms de la capacidad de tu taxonomía (se ve cuando haces var_dump($wp_taxonomies[$taxonomyyouwant]));
add_submenu_page($YOURPARENTSLUG, 'menu', 'title', 'manage_tags', 'edit-tags.php?taxonomy=taxonomy');
}

Si tu submenú carece del prefijo admin.php?page=
, primero debes registrar el menú padre y luego el submenú.
add_action( 'admin_menu', function() {
// Primero el menú padre
add_menu_page( 'Título de la página', 'Título del Menú', 'capacidad', 'slug-padre', 'callback' );
// Luego los submenús
add_submenu_page( 'slug-padre', 'Título del Submenú', 'Título del Submenú', 'capacidad', 'slug', 'callback' );
} );
De lo contrario, el enlace será solamente el slug.

Gracias Oleg, tu script funciona pero rompe la interfaz de administración (los colores de fondo e imágenes desaparecen por alguna razón).
Pero si tengo que seguir este camino, puedo hacer esto en su lugar:
function changeUrl()
{
$pageURL = 'http://'.$_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
if ($pageURL == 'http://www.misitio.com/wp-admin/admin.php?page=xxxx')
{
header ('location:http://www.misitio.com/wp-admin/edit-tags.php?taxonomy=category');
}
}
add_action( 'admin_menu', 'changeUrl' );
Me parece curioso que no haya una forma sencilla de enlazar un submenú a cualquier URL. Este tipo de redirección es desordenado... pero funciona.

Aunque este es un problema antiguo, me gustaría contribuir con este código para su consideración:
function mysite_admin_menu()
{
add_menu_page( 'Categorías', 'Categorías', 'administrator', 'categories', 'a_function' );
add_submenu_page( 'categories', 'Administrar', 'Administrar', 'administrator', 'manage_categories', 'mysite_manage_categories' );
remove_submenu_page('categories','categories');
}
add_action( 'admin_menu', 'mysite_admin_menu' );
function mysite_manage_categories()
{
?><script>window.location = "<?php echo admin_url('edit-tags.php?taxonomy=category'); ?>";</script><?php
}
Utiliza una redirección con JavaScript en lugar de crear otro add_action para redirigir mediante HTTP.
