¿Tú también te has hartado ya de que cualquier plugin o el tema decidan dónde poner sus menús y submenús, abarrotando el escritorio de administración de TU WordPress?
Pues eso se ha acabado pero ya, sin contemplaciones, aquí tienes la solución, o soluciones.
Un código para someterlos a (casi) todos
Mira que pensé andar dándole vueltas a esto de los menús y crear una función personalizable, pero cuando llegas a este punto de hartazgo de menús, lo que te pide el cuerpo son soluciones radicales, y eso es lo que he preparado.
El siguiente código mueve TODOS los menús que no sean nativos de WordPress y, sin pedir permiso ni avisar, a la brava, los mueve todos como submenús de ese menú de la administración de WordPress que tan poco usas, el menú Herramientas. ¿A que he estado fino ahí? 😀
En fin, el código, que me enrollo:
/* Quitar menús principales que no sean de WordPress y añadirlos como submenús de Herramientas */
add_action( 'admin_menu', function() {
global $menu, $submenu;
// Lista de slugs que se salvan de la quema - Añade tus propios slugs si quieres excluir el menú o submenú de algún plugin o el tema
$core_menus = [
'index.php',
'edit.php',
'upload.php',
'edit.php?post_type=page',
'edit-comments.php',
'themes.php',
'plugins.php',
'users.php',
'tools.php',
'options-general.php',
];
$position = 99; // Para controlar el orden de los menús y submenús
foreach ( $menu as $item ) {
$slug = isset($item[2]) ? $item[2] : '';
if ( $slug && ! in_array( $slug, $core_menus ) ) {
// Eliminamos los molestos menús principales
remove_menu_page( $slug );
// Añade el menú principal como submenú del nativo de Herramientas
add_submenu_page(
'tools.php', // Aquí el slug de a dónde movemos los molestos menús
$item[0],
$item[0],
$item[1],
$slug,
'', // Callback automático para no tener que definir nombres de menús uno a uno
$position++
);
// Añade los submenús con un pequeño prefijo visual para que se sepa de qué menú son submenús
if ( isset( $submenu[ $slug ] ) && is_array( $submenu[ $slug ] ) ) {
foreach ( $submenu[ $slug ] as $subitem ) {
if ( $subitem[2] === $slug ) continue; // Evita duplicar el principal
add_submenu_page(
'tools.php', // Aquí el slug de a dónde movemos los molestos menús
$subitem[0],
'— ' . strip_tags($item[0]) . ': ' . $subitem[0],
$subitem[1],
$subitem[2],
'', // Callback automático para no tener que definir nombres de menús uno a uno
$position++
);
}
}
}
}
}, 99 );
¿Que qué hace esto? Pues lo dicho, quita de la barra de menús de administración de TU WordPress todos los menús que no sean los nativos de WordPress y los mueve sin piedad bajo el menú nativo de herramientas.
O sea, pasamos de esto…
A esto otro … donde has recuperado el control de tu escritorio de WordPress, y hasta la alegría de vivir…
¿Qué dónde están ahora los menús de tus plugins o el tema? Pues bien ordenaditos, ocupando un espacio humilde, tímido, sumiso a ti, su líder supremo, como submenús de las herramientas…
¿Se pueden hacer cambios en el código?
Se me ocurren 2 cambios bastante lógicos que podrías querer hacer:
- Cambiar el menú de acogida, para que no sea el de herramientas.
- Excluir algunos menús a los quieras perdonar, y que no se oculten bajo el menú de herramientas.
Un ejemplo de lo primero, moviendo todos los menús de plugins y el tema como submenús del menú de plugins de WordPress (en rojo lo que cambia) sería así:
/* Quitar menús principales que no sean de WordPress y añadirlos como submenús de plugins */
add_action( 'admin_menu', function() {
global $menu, $submenu;
// Lista de slugs que se salvan de la quema - Añade tus propios slugs si quieres excluir el menú o submenú de algún plugin o el tema
$core_menus = [
'index.php',
'edit.php',
'upload.php',
'edit.php?post_type=page',
'edit-comments.php',
'themes.php',
'plugins.php',
'users.php',
'tools.php',
'options-general.php',
];
$position = 99; // Para controlar el orden de los menús y submenús
foreach ( $menu as $item ) {
$slug = isset($item[2]) ? $item[2] : '';
if ( $slug && ! in_array( $slug, $core_menus ) ) {
// Eliminamos los molestos menús principales
remove_menu_page( $slug );
// Añade el menú principal como submenú del nativo de Herramientas
add_submenu_page(
'plugins.php', // Aquí el slug de a dónde movemos los molestos menús
$item[0],
$item[0],
$item[1],
$slug,
'', // Callback automático para no tener que definir nombres de menús uno a uno
$position++
);
// Añade los submenús con un pequeño prefijo visual para que se sepa de qué menú son submenús
if ( isset( $submenu[ $slug ] ) && is_array( $submenu[ $slug ] ) ) {
foreach ( $submenu[ $slug ] as $subitem ) {
if ( $subitem[2] === $slug ) continue; // Evita duplicar el principal
add_submenu_page(
'plugins.php', // Aquí el slug de a dónde movemos los molestos menús
$subitem[0],
'— ' . strip_tags($item[0]) . ': ' . $subitem[0],
$subitem[1],
$subitem[2],
'', // Callback automático para no tener que definir nombres de menús uno a uno
$position++
);
}
}
}
}
}, 99 );
El resultado queda así:
Y este sería un ejemplo de lo segundo, en esta ocasión salvando al menú de productos y el de eventos, por mera eficiencia, de WooCommerce y The Events Calendar respectivamente (cambios también en rojo):
/* Quitar menús principales que no sean de WordPress menos los de productos y eventos y añadirlos como submenús de Herramientas */
add_action( 'admin_menu', function() {
global $menu, $submenu;
// Lista de slugs que se salvan de la quema - Añade tus propios slugs si quieres excluir el menú o submenú de algún plugin o el tema
$core_menus = [
'index.php',
'edit.php',
'upload.php',
'edit.php?post_type=page',
'edit-comments.php',
'themes.php',
'plugins.php',
'users.php',
'tools.php',
'options-general.php',
'edit.php?post_type=product',
'edit.php?post_type=tribe_events',
];
$position = 99; // Para controlar el orden de los menús y submenús
foreach ( $menu as $item ) {
$slug = isset($item[2]) ? $item[2] : '';
if ( $slug && ! in_array( $slug, $core_menus ) ) {
// Eliminamos los molestos menús principales
remove_menu_page( $slug );
// Añade el menú principal como submenú del nativo de Herramientas
add_submenu_page(
'tools.php', // Aquí el slug de a dónde movemos los molestos menús
$item[0],
$item[0],
$item[1],
$slug,
'', // Callback automático para no tener que definir nombres de menús uno a uno
$position++
);
// Añade los submenús con un pequeño prefijo visual para que se sepa de qué menú son submenús
if ( isset( $submenu[ $slug ] ) && is_array( $submenu[ $slug ] ) ) {
foreach ( $submenu[ $slug ] as $subitem ) {
if ( $subitem[2] === $slug ) continue; // Evita duplicar el principal
add_submenu_page(
'tools.php', // Aquí el slug de a dónde movemos los molestos menús
$subitem[0],
'— ' . strip_tags($item[0]) . ': ' . $subitem[0],
$subitem[1],
$subitem[2],
'', // Callback automático para no tener que definir nombres de menús uno a uno
$position++
);
}
}
}
}
}, 99 );
El resultado, este:
¿Y si algún menú se «resiste» a dejarse mover?
Puede pasar que algunos menús de plugins no se dejen mover, y en este caso tendrás que generar un código diferente que…
- Elimine el menú existente.
- Cree el menú del plugin como submenú debajo del menú de herramientas.
Un ejemplo típico es el menú del plugin Jetpack, y se hacía así:
/* Mover menú de administración de Jetpack como submenú de herramientas */
add_action( 'admin_menu', function() {
// Elimina el menú principal de Jetpack
remove_menu_page( 'jetpack' );
// Añade Jetpack como submenú bajo Herramientas
add_submenu_page(
'tools.php', // Superior: Herramientas
'Jetpack', // Título de la página
'Jetpack', // Título en el menú
'manage_options', // Capability (puedes cambiarlo si usas otro)
'jetpack', // Slug (el mismo que el original)
'', // Callback (Jetpack ya lo gestiona solo)
120 // Posición (puedes cambiarla si lo quieres antes/después)
);
}, PHP_INT_MAX );
Si te pasa algo así simplemente adapta el código anterior al menú del plugin que se resista en tu caso (y si no te apañas me dices cuál es abajo en los comentarios) y añádelo a continuación del código que hemos visto anteriormente.
¿Cómo y dónde añado estos códigos a mi WordPress?
- El cómo lo explico en esta guía de cómo añadir códigos personalizados a WordPress.
- El dónde en esta ocasión creo hay que evitar la opción de archivo
functions.phpdel tema hijo, y optar por una de estas otras opciones:- Como plugin MU.
- Como plugin personalizado.
- Con un plugin de snippets de código.
Espero que te haya gustado, sino te espero espada desenvainada en la sección de comentarios (ahí abajo) para lo que guste vuesa merced 😀
¿Te gustó este artículo? ¡Ni te imaginas lo que te estás perdiendo en YouTube!












