¿Cómo añadir un separador al menú de administración?

6 oct 2010, 23:02:41
Vistas: 27K
Votos: 27

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

¿Alguna idea?

1
Comentarios

En caso de que alguien todavía esté buscando la respuesta a esto, este plugin puede encargarse del trabajo.

user31760 user31760
2 may 2013 14:43:53
Todas las respuestas a la pregunta 7
8
40

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.

7 oct 2010 05:00:18
Comentarios

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.

user1147 user1147
7 oct 2010 19:53:51

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.

MikeSchinkel MikeSchinkel
7 oct 2010 20:39:50

@MikeSchinkel Este método no me funciona con WordPress 3.3.1.

Jim Geurts Jim Geurts
10 ene 2012 00:49:38

@JimGeurts - tampoco me funciona a mí :/

Evan Mattson Evan Mattson
24 abr 2012 20:56:01

Parece que ya no funciona.

MastaBaba MastaBaba
19 jun 2016 16:43:17

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 MikeSchinkel
23 jun 2016 04:23:41

@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 :)

fregante fregante
1 feb 2018 17:46:41

Query Monitor muestra un error de PHP vía AJAX en la función add_admin_menu_separator, y parece que es porque $menu no existe para las peticiones REST API. Envolver todo después del global $menu en un if (!empty($menu)) { } parece resolverlo.

cbirdsong cbirdsong
26 ene 2022 16:37:03
Mostrar los 3 comentarios restantes
0

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.

19 sept 2012 16:06:52
0

Tuve algunos problemas con los separadores que no se agregaban, se debía a la forma en que WordPress elimina los separadores duplicados. Agregar ksort($menu); al final de la función corrigió el problema.

18 nov 2010 05:15:37
0

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.

7 ago 2020 09:45:55
0

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;
    }
});
8 may 2018 15:44:07
2

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. :-)

6 oct 2010 23:32:00
Comentarios

Estoy intentando añadir un separador en el menú de administración. Antes de publicar la pregunta intenté usar add_menu_page().

user1147 user1147
6 oct 2010 23:56:09

Parece que MikeSchinkel te ha respondido bastante bien. Disculpa el malentendido. ¡Buena suerte!

dgw dgw
7 oct 2010 23:41:22
2

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).

19 jun 2016 16:57:35
Comentarios

No hay diferencia con la respuesta existente y aceptada, excepto que no das ninguna explicación. Por favor, lee [respuesta].

fuxia fuxia
19 jun 2016 18:19:31

@toscho: Bueno, esto funciona para mí y la respuesta aceptada no.

MastaBaba MastaBaba
19 jun 2016 20:22:19