¿Cómo añadir un separador al menú de administración?
¿Alguien sabe cómo añadir un separador al menú de administración? Encontré esto pero no me ayudó.
¿Alguna idea?

Aquí hay una forma rápida y sencilla de lograr lo que necesitas.
Contexto
WordPress almacena las secciones del menú de administración en un array global llamado $menu
. Para agregar un separador, añades un elemento al array $menu
usando un índice que esté entre los índices de las opciones que deseas separar.
Usando la función add_admin_menu_separator()
Así que he escrito una función para encapsular esta lógica llamada add_admin_menu_separator()
. Necesitarás elegir un número de índice del array que sea mayor que la opción después de la cual quieres agregar un separador, y luego llamar a la función add_admin_menu_separator()
pasando dicho índice como parámetro.
Por ejemplo:
add_admin_menu_separator(37);
La función add_admin_menu_separator()
en sí
Aquí está la definición de la función add_admin_menu_separator()
que puedes copiar en el archivo functions.php
de tu tema. Sí, es complejo, pero también lo es el código que crea y usa el array global $menu
. (Afortunadamente, hay planes para eventualmente dejarlo obsoleto, aunque probablemente pasarán algunos años.)
function add_admin_menu_separator($position) {
global $menu;
$index = 0;
foreach($menu as $offset => $section) {
if (substr($section[2],0,9)=='separator')
$index++;
if ($offset>=$position) {
$menu[$position] = array('','read',"separator{$index}",'','wp-menu-separator');
break;
}
}
ksort( $menu );
}
Encontrando el índice en $menu
que necesitas
Para determinar qué número de índice necesitas, puedes hacer un var_dump()
de $GLOBALS['menu']
desde un hook admin_init
. Aquí hay un fragmento de código que puedes agregar temporalmente al archivo functions.php
de tu tema para ver cuáles son los valores. Esto solo funcionará al solicitar una URL que empiece con /wp-admin/
(¡pero asegúrate de hacerlo con FTP y no con el editor de temas integrado, o perderás acceso a tu sitio, al menos hasta que tengas acceso FTP al archivo functions.php
de tu tema!):
add_action('admin_init','dump_admin_menu');
function dump_admin_menu() {
if (is_admin()) {
header('Content-Type:text/plain');
var_dump($GLOBALS['menu']);
exit;
}
}
Ver también:
Por cierto, estos enlaces pueden ser útiles en general para trabajar con menús de administración:
Aunque mis clases de menú de administración actualmente no ofrecen una forma fácil de agregar separadores, creo que ahora lo añadiré cuando tenga tiempo.

Gracias Mike, estuve toda la noche estudiando la variable global menu, pero no logré agregar un separador. Ahora entiendo mucho mejor cómo funcionan los menús en WordPress.

Hola @user1147: Sí, son bastante difíciles de entender. La primera vez que tuve que hacerlo me llevó mucho tiempo, y todavía tengo problemas con ellos. Por eso escribí esas funciones, para poder hacerlo de manera más fácil a partir de ahora. De todos modos, me alegra que mi respuesta te haya ayudado.

Acabo de probarlo y "funciona" en la 4.5, pero WordPress decidió eliminar las líneas así que simplemente ya no aparecen. Creo que la solución sería añadir CSS pero por más que lo intento no logro averiguar qué CSS añadir ya que soy desarrollador backend y no se me da bien el CSS. ¿Quizás alguien más pueda sugerir algo?

@MikeSchinkel ese error ya está corregido. El código sugerido establecería el separador en el índice especificado, pero si añadimos algo de ruido aleatorio al índice no será reemplazado — porque 37.4345
no es igual a 37
:)

Es tan fácil como:
add_action( 'admin_init', 'add_sep' );
function add_sep() {
if ( ! is_admin() )
return false;
global $menu;
$sep = $menu[4]; // ese es el separador por defecto
$pos = 6; // cámbialo por la posición deseada
$menu = array_merge(
array_slice( $menu, 0, $pos ),
array( $sep ),
array_slice( $menu, $pos + 1, -1)
);
$menu[ $pos - 1 ][4] .= ' menu-top-last';
$menu[ $pos + 1 ][4] .= ' menu-top-first';
}
Nota: La posición del separador por defecto ($menu[4]
) puede ser diferente dependiendo de la configuración que tú (o tus plugins) hayan hecho antes de este hook.
Por supuesto, también puedes ajustar la introspección de las clases menu-top-first
y menu-top-last
.

Puedes simplemente agregar esto en functions.php
add_action('admin_menu', function () {
global $menu;
$menu[49] = ['', 'read', '', '', 'wp-menu-separator'];
});
Donde 49 es la posición del separador. Debes recordar que la posición del separador puede reemplazar tu elemento de menú si tiene la misma posición.

Esto se basa en la respuesta de MastaBaba, pero no reemplaza nada en la posición que especifiques - simplemente añade el separador después.
También utiliza una función anónima, por lo que solo es compatible con versiones de PHP 5.3 y superiores.
add_action( 'admin_menu', function () {
$position = 29;
global $menu;
$separator = [
0 => '',
1 => 'read',
2 => 'separator' . $position,
3 => '',
4 => 'wp-menu-separator'
];
if (isset($menu[$position])) {
$menu = array_splice($menu, $position, 0, $separator);
} else {
$menu[$position] = $separator;
}
});

Es un poco difícil determinar exactamente lo que intentas hacer, pero creo que estás buscando agregar una entrada de primer nivel en el menú de administración de WordPress.
Consulta esta documentación en el Codex de WordPress.
En resumen, lo que necesitas es usar la función add_menu_page()
, que acepta varios argumentos y muestra un elemento adicional en el menú administrativo como hermano de "Escritorio", "Entradas", "Medios", etc.
Espero haberte entendido correctamente. :-)

El siguiente código añade una acción a WordPress que se ejecuta cuando se renderiza el menú de administración. El menú de administración es un array y lo que haces aquí es añadir un elemento al array que define un separador, en la posición que especifiques.
Desde aquí:
add_action( 'admin_menu', 'set_admin_menu_separator' );
function set_admin_menu_separator() {
$position = 79;
global $menu;
$menu[$position] = array(
0 => '',
1 => 'read',
2 => 'separator' . $position,
3 => '',
4 => 'wp-menu-separator'
);
}
Nota que, aunque esto se parece bastante a la respuesta actualmente aceptada, dicha respuesta no funcionó para mí (y, a juzgar por los comentarios, para varios otros).
