¿Agregar un separador al menú de administración?

22

¿Alguien sabe cómo agregar un separador de menú de administrador? Encontré esto pero no ayudó.

¿Algunas ideas?

usuario1147
fuente
En caso de que alguien todavía esté buscando la respuesta a esto, este complemento puede manejar el trabajo.
user31760

Respuestas:

33

Aquí hay una manera rápida y sucia de obtener lo que quieres.

Fondo

WordPress almacena las secciones del menú de administración en una matriz global llamada $menu. Para agregar un separador, agrega un elemento a la $menumatriz utilizando un índice que se encuentra entre los índices de las opciones que desea separar.

Usando la add_admin_menu_separator()función

Así que he escrito una función para encapsular la lógica de esto que llamé add_admin_menu_separator(). Deberá elegir un número de índice de matriz que sea más alto que la opción después de la cual desea agregar un separador, y luego llamar a la función que add_admin_menu_separator()pasa dicho índice como su parámetro.

Por ejemplo:

add_admin_menu_separator(37);

La add_admin_menu_separator()función en sí

Aquí está la definición de la función add_admin_menu_separator()que puede copiar en el functions.phparchivo de su tema . Sí, es arcano, pero también lo es el código que crea y usa la $menumatriz global . (Afortunadamente, los planes son desaprobarlo, pero probablemente serán unos pocos 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 );
}

Encontrar el índice $menuque necesitas

Para averiguar qué número de índice que necesita se puede hacer una var_dump()de $GLOBALS['menu']desde dentro de un admin_initgancho. Aquí hay un poco de código que puede colocar functions.phptemporalmente en el archivo de su tema para ver cuáles son los valores. Esto solo funcionará cuando solicite una URL que comience con /wp-admin/ (pero asegúrese de hacerlo con FTP y no con el editor de temas incorporado o perderá el acceso a su sitio, ¡al menos hasta que obtenga acceso FTP al functions.phparchivo de su 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, puede encontrar estos enlaces útiles en general para trabajar con menús de administración:

Aunque mis clases de menú de administrador actualmente no ofrecen una manera fácil de agregar separadores, creo que ahora lo agregaré cuando tenga tiempo.

MikeSchinkel
fuente
Gracias Mike, revisé toda la noche estudiando el menú var global, pero no logré agregar un separador, ahora es mucho más claro para mí cómo funcionan los menús en wp.
usuario1147
Hola @ user1147 : Sí, son muy difíciles de entender. La primera vez que tuve que hacerlo me llevó bastante tiempo, y todavía lucho con ellos. ¡Por eso escribí esas funciones, de modo que puedo hacerlo de una manera fácil a partir de ahora! De todos modos, me alegro de que mi respuesta haya ayudado.
MikeSchinkel
1
@MikeSchinkel Este método no me funciona con Wordpress 3.3.1.
Jim Geurts
1
@JimGeurts: tampoco me funciona: /
Evan Mattson el
2
Acabo de probarlo y "funciona" en 4.5, pero WordPress decidió deshacerse de las líneas si ya no aparecen. Creo que la solución es agregar CSS, pero no puedo entender qué CSS agregar, ya que soy un desarrollador de back-end y soy un asco en CSS. Tal vez alguien más puede sugerir?
MikeSchinkel
4

Es facil como:

add_action( 'admin_init', 'add_sep' );
function add_sep() {

    if ( ! is_admin() )
        return false;

    global $menu;
    $sep = $menu[4]; // that's the default separator
    $pos = 6; // change it for the desired position
    $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 predeterminada ( $menu[4]) puede ser diferente según la configuración que usted (o sus complementos) haya realizado antes de este enlace.

Por supuesto, también puede ajustar la introspección menu-top-firsty menu-top-lastclases.

vmassuchetto
fuente
2

Hubo algunos problemas con los separadores que no se agregaron, se debió a la forma en que Wordpress elimina los separadores duplicados. Agregar ksort($menu);al final de la función corrigió el problema.


fuente
1

Esto se basa en la respuesta de MastaBaba, pero no reemplaza nada en la posición que especifique, simplemente agrega el separador después.

También utiliza una función anónima, por lo que solo es compatible con PHP versión 5.3 y superior.

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;
    }
});
robrecord
fuente
0

Es un poco difícil determinar qué estás tratando de hacer, pero creo que estás buscando agregar una entrada de nivel superior en el menú de administración de WordPress.

Consulte esta documentación en el Codex de WordPress.

En resumen, está buscando el uso de la add_menu_page()función, que toma una serie de argumentos y muestra un elemento adicional en el menú administrativo como hermano de "Panel de control", "Publicaciones", "Medios", etc.

Espero haberlo hecho bien. :-)

dgw
fuente
Solo estoy tratando de agregar un separador de menú de administración. Antes de publicar la pregunta que traté de usar add_menu_page().
usuario1147
Parece que MikeSchinkel te cubrió bastante bien. Perdón por el malentendido. ¡Buena suerte!
dgw
0

El siguiente anuncio es una acción para Wordpress que se ejecuta cuando se muestra el menú de administración. El menú de administración es una matriz y todo lo que está haciendo aquí es agregar un elemento de matriz que define un separador, en la posición que especifique.

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'
);
}

Tenga en cuenta que, aunque esto se parece bastante a la respuesta actualmente aceptada, la respuesta actualmente aceptada no funcionó para mí (y, a juzgar por los comentarios, para varios otros).

MastaBaba
fuente
No hay diferencia en la respuesta aceptada existente, excepto que no da ninguna explicación. Por favor, lea Cómo responder .
fuxia
@toscho: Bueno, esto funciona para mí y la respuesta aceptada no.
MastaBaba