Agregar una página de administración sin mostrarla en el menú de administración
Tengo un plugin personalizado 'Charts' que tiene su propio menú. En ese menú hay enlaces a las 3 páginas del plugin - 'Charts', 'Add Chart' y 'Edit Chart'. Sin embargo, no quiero mostrar el enlace a 'Edit Chart'.
Así es como agrego la página en cuestión -
$this->pagehook = add_submenu_page('charts', __('Edit Chart'), __('Edit Chart'), 'edit_charts', 'edit-chart', array(&$this, 'on_show_page'));
He buscado por internet y no puedo encontrar una manera de hacer esto (que funcione). Es posible eliminar menús completos de nivel superior (no es lo que necesito), y puedes eliminar entradas individuales del global $submenu
(pero hacer eso también elimina la capacidad registrada), por lo que nadie puede acceder a la página -
global $submenu;
if(!empty($submenu['charts'])) : foreach($submenu['charts'] as $key => $page) :
if($page[0] === 'Edit Chart') :
/** Elimina todos los permisos para acceder a la página */
//unset($submenu['charts'][$key]);
/** Elimina el título, pero la entrada del menú aún existe, así que se ve extraño */
$submenu['charts'][$key][0] = '';
endif;
endforeach;
endif;
He investigado cómo ocultarlo mediante CSS, pero no veo una manera de hacerlo a través del HTML que WordPress genera -
<li><a href="admin.php?page=edit-chart" tabindex="1">Edit Chart</a></li>
También he considerado jQuery, pero tiene limitaciones similares a la ruta CSS, además me niego a creer que soy el único que ha deseado hacer esto - debe haber una manera, ¡simplemente no puedo encontrarla!
Cualquier consejo y sugerencia será apreciado.
Gracias.

De la documentación sobre add_submenu_page()
, puedes ver que puedes ocultar el enlace de tu submenú de un elemento de menú de nivel superior al que pertenece estableciendo el slug
(primer argumento) en null
:
add_action( 'admin_menu', 'register_my_custom_submenu_page' );
function register_my_custom_submenu_page() {
add_submenu_page(
null,
'Mi página de submenú personalizada',
'Mi página de submenú personalizada',
'manage_options',
'my-custom-submenu-page',
'my_custom_submenu_page_callback',
);
}
Para resaltar el elemento de menú deseado (por ejemplo, 'todos los gráficos' al acceder a la página oculta 'editar gráfico'), puedes hacer lo siguiente:
add_filter( 'submenu_file', function($submenu_file){
$screen = get_current_screen();
if($screen->id === 'id-de-la-pagina-a-ocultar'){
$submenu_file = 'id-de-la-pagina-a-resaltar';
}
return $submenu_file;
});

Genial, pero el resaltado no funciona correctamente. Si configuro submenu_file
se muestran como actuales. Pero el menú de nivel superior no se abre. Pero si configuro parent_file
, WordPress ejecuta la función get_admin_page_parent()
después de los filtros y lo cambia de vuelta. ¿Para qué los desarrolladores de WordPress agregaron el filtro parent_file
si de todos modos la función lo cambia de vuelta? ¿Podrías ayudar?

Además, si parent_slug
se establece como null
, page_title
no se usa en el título.

Usa una página de submenú como slug padre. El menú de administración solo tiene dos niveles, por lo que el tercer nivel imaginario quedará oculto.
Código de ejemplo, probado:
add_action( 'admin_menu', 'wpse_73622_register_hidden_page' );
function wpse_73622_register_hidden_page()
{
add_submenu_page(
'options-writing.php',
'¡Oculto!',
'¡Oculto!',
'exists',
'wpse_73622',
'wpse_73622_render_hidden_page'
);
# /wp-admin/admin.php?page=wpse_73622
}
function wpse_73622_render_hidden_page()
{
echo '<p>hola mundo</p>';
}

Podrías usar CSS y podrás acceder a él a través de la URL en la etiqueta href:
#adminmenu a[href="admin.php?page=edit-chart"] {
display: none;
}
No hay rellenos o espacios adicionales para el elemento LI padre, por lo que no necesitas ocultarlo. También seguirás pudiendo acceder al submenú.
