Prevenir enlace duplicado cuando usas add_menu_page en WordPress

Si alguna vez desarrolláis temas o plugins con WordPress, es muy probable que necesitéis manejar los menú del escritorio. En el caso que en lugar de querer poner vuestro panel de opciones en la sección de “Ajustes” queráis hacerlo directamente en vuestra propia sección, manejaréis la función add_menu_page.

Como veis en la referencia y sin entrar en detalles, esta función nos permite crear un menú para luego poder poner nuestras opciones dentro de él. Sin embargo, por defecto, realiza una acción que quizás no sea del todo de vuestro gusto.

¿Cuál? Básicamente queréis un menú que sea: MiPlugin, y dentro de él haya: Nuevo, Editar, Listar, por ejemplo. Para insertar las opciones, usaréis la función add_submenu_page.

¿Qué problema tendréis? El resultado será el siguiente, tras el menú MiPlugin estarán estas opciones: MiPlugin, Nuevo, Editar y Lista. ¿Por qué aparece repetido el título en la primera opción?

Es una característica de la función y la solución viene indicada en la referencia pero no aparece muy claro, básicamente lo que tenemos que hacer es lo siguiente, añadir un add_submenu_page en blanco que haga referencia al de arriba y así no se mostrará duplicado:

add_menu_page(
    'MiPlugin', 
    'MiPlugin Menu',
    'edit_themes', 
    'miplugin_admin', // slug
    'functions.php',
    get_bloginfo('template_directory') .'/img/favicon.png',
    31
);

add_submenu_page(
    'miplugin_admin', // slug, debe coincidir con el de arriba
    '',        // debe estar vacío
    '',        // debe estar vacío
    'edit_themes',        
    'miplugin_admin',       // slug, debe coincidir con el de arriba
    'functions.php',        // slug, debe coincidir con el de arriba
}

Desde luego que es un método raro, pero es el que está establecido, porque lo normal es que queramos duplicar ese enlace y la idea es ahorrar trabajo en la mayoría de los casos.

NOTA: existen otros métodos, esconderlo con CSS, con jQuery, hacerle un unset, etc. pero todos estos métodos son parches más que una solución de diseño correcta como la que he mostrado.