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?
DARK_DIESEL
Además, si parent_slug se establece como null, page_title no se usa en el título.
DARK_DIESEL
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ú.