¿Cómo colocar un menú de tipo de entrada personalizada encima del menú de Entradas usando menu_position?

7 feb 2011, 20:38:05
Vistas: 37.9K
Votos: 27

Acabo de descubrir el parámetro menu_position y parece que puedes colocar el menú de tu tipo de entrada personalizada casi en cualquier lugar. ¡Excepto encima del menú de Entradas!

¿Cómo puedo lograr esto?

1
Comentarios

Buena pregunta, parece que ese es el único lugar al que no llegará.

jnthnclrk jnthnclrk
29 ago 2013 15:44:36
Todas las respuestas a la pregunta 10
1
31

Posiciones para los elementos del menú principal

  • 2 Escritorio
  • 4 Separador
  • 5 Entradas
  • 10 Medios
  • 15 Enlaces
  • 20 Páginas
  • 25 Comentarios
  • 59 Separador
  • 60 Apariencia
  • 65 Plugins
  • 70 Usuarios
  • 75 Herramientas
  • 80 Ajustes
  • 99 Separador

Descripción del parámetro para "posición del menú"

$position (entero) (opcional) La posición en el orden del menú donde este elemento debería aparecer. Por defecto, si se omite este parámetro, el menú aparecerá al final de la estructura del menú. Cuanto mayor sea el número, más abajo aparecerá en el menú.

ADVERTENCIA: si dos elementos del menú usan el mismo atributo de posición, uno de los elementos podría sobrescribirse, mostrándose solo uno de ellos. ¡El riesgo de conflicto puede reducirse usando valores decimales en lugar de enteros, por ejemplo 63.3 en vez de 63!

Por defecto: al final de la estructura del menú

21 sept 2012 04:53:09
Comentarios

¿Cómo usar decimales en 'menu_position' =>3,? Quiero usar position=3 para muchos tipos de entradas personalizadas.

Bikram Bikram
4 feb 2020 11:19:05
0

El nuevo plugin JetPack coloca su enlace de menú justo debajo del enlace del Escritorio. Lo hace estableciendo su orden de menú a 0, filtrando el array $menu_order:

function jetpack_menu_order( $menu_order ) {
        $jp_menu_order = array();

        foreach ( $menu_order as $index => $item ) {
            if ( $item != 'jetpack' )
                $jp_menu_order[] = $item;

            if ( $index == 0 )
                $jp_menu_order[] = 'jetpack';
        }

        return $jp_menu_order;
    }

Por curiosidad, ¿qué pasaría si intentaras usar 0 como menu_position?

28 mar 2011 22:42:15
1

Buscando una solución en la web pero no encontré. Simplemente este truco funciona (por ejemplo). Aquí tienes la lista nativa de posiciones:

  • 2 Escritorio
  • 4 Separador
  • 5 Entradas
  • 10 Medios
  • 15 Enlaces
  • 20 Páginas
  • 25 Comentarios
  • 59 Separador
  • 60 Apariencia
  • 65 Plugins
  • 70 Usuarios
  • 75 Herramientas
  • 80 Ajustes
  • 99 Separador

Si tienes más elementos, puedes leer la posición actual de cada uno imprimiendo el global $menu:

global $menu; 
print_r($menu); 

Entonces, si entiendo bien, nada nos impide reordenar el menú como queramos:

function re_order_menu () {
    // ------- Quitar elementos  
    $dashboard = $menu[2]
    $separator1 = $menu[4]
    $posts = $menu[5]
    $media = $menu[10]
    $links = $menu[15]
    $pages = $menu[20]
    $comments = $menu[25]
    $separator2 = $menu[59]
    $appearance = $menu[60]
    $plugins = $menu[65]
    $users = $menu[70]
    $tools = $menu[75]
    $settings = $menu[80]
    $separator3 = $menu[99]

    // -------- Reiniciar menú  
    unset($menu[2]);
    unset($menu[4]);
    unset($menu[5]);
    unset($menu[10]);
    unset($menu[15]);
    unset($menu[20]);
    unset($menu[25]);
    unset($menu[59]);
    unset($menu[60]);
    unset($menu[65]);
    unset($menu[70]);
    unset($menu[75]);
    unset($menu[80]);
    unset($menu[99]);

    // -------- Reordenar menú como prefieras
    $dashboard = $menu[2];
    $separator1 = $menu[4]
    $posts = $menu[5];
    $books = $menu[6];
    /* mis muchos elementos personalizados */
    $authors  = $menu[7];
    $requests = $menu[8];
    $clients = $menu[9];
    $sellers  = $menu[10];
    $services = $menu[11];
    $schedules = $menu[12];
    /* dejar algo de espacio después */ 
    $media = $menu[30];
    $links = $menu[31];
    $pages = $menu[32];
    $comments = $menu[33];
    $separator2 = $menu[59];
    $appearance = $menu[60];
    $plugins = $menu[65];
    $users = $menu[70];
    $tools = $menu[75];
    $settings = $menu[80]
    $separator3 = $menu[99];

} 
add_action('admin_menu', 're_order_menu');

Funciona bien para mí, así que creo que es válido, ¿estoy equivocado?

18 may 2017 01:09:43
Comentarios

Solución muy frágil que depende de números mágicos. Se rompería tan pronto como se agregue o elimine algún otro plugin que coloque un elemento entre los demás.

Walf Walf
13 nov 2019 01:19:02
0

He utilizado 'menu_position' => 0, 1, 2, 3, 4.

Realmente no importa mucho. Si experimentas con ello, podrás entenderlo fácilmente.

Usar 'menu_position' => 1 debería colocarlo debajo del elemento del menú Panel de control y encima del separador. 0 debería colocarlo encima del Panel de control

23 feb 2011 03:12:04
0

Este es un error en WordPress. Por favor, revisa este hilo en Trac: http://core.trac.wordpress.org/ticket/14755

Corregido en la versión 4.4...

https://developer.wordpress.org/reference/functions/add_menu_page/#notes

6 sept 2012 21:41:55
1

Puedes usar esto:

function my_move_post () {
    global $menu;
    $menu[6] = $menu[5]; //mueve el post de la posición 5 a la 6
    unset($menu[5]); //libera la posición 5 para que puedas usarla
}
add_action('admin_menu', 'my_move_post');

Ahora puedes usar la posición 5 para agregar tu menú encima del menú de Entradas.

19 dic 2013 16:33:09
Comentarios

Esto no funcionó para mí. Lo coloqué dentro de mi plugin de todo el sitio donde está mi archivo custom-post-type.php

Daniel Daniel
14 ago 2014 19:19:04
0

aquí está la advertencia sobre todo el problema...

WordPress 4.9.2

wp-admin/menu.php:

// Si vamos a usar $_wp_last_object_menu, incrementarlo primero.
$ptype_menu_position = is_int( $ptype_obj->menu_position ) ? $ptype_obj->menu_position : ++$_wp_last_object_menu;

NOTA: debe ser un entero y NO estar ya establecido, de lo contrario irá al final de la lista.

20 ene 2018 17:41:02
0

Para una solución funcional en WordPress 5 y versiones anteriores, reposiciónalo con el siguiente código:

add_filter('custom_menu_order', '__return_true');
add_filter('menu_order', function($menu_order) {
    if (
        false !== ($k1 = array_search($v1 = 'edit.php', $menu_order))
        && false !== ($k2 = array_search($v2 = 'edit.php?post_type=foo', $menu_order))
    ) {
        array_splice($menu_order, $k1, 0, $v2);
        array_splice($menu_order, $k2 + 1, 1);
    }
    return $menu_order;
});

Esto asume que no tienes más de un elemento de menú compitiendo por la primera posición.

21 ago 2018 16:28:31
5

En el mismo enlace que compartiste, se lee:

menu_position
(entero) (opcional) La posición en el orden del menú donde debe aparecer el tipo de publicación.
Valor predeterminado: null - por defecto aparece debajo de Comentarios
5 - debajo de Entradas
10 - debajo de Medios
20 - debajo de Páginas
60 - debajo del primer separador
100 - debajo del segundo separador

Entonces, si configuras menu_position con un valor como 4, debería colocarlo por encima de las entradas.

Una posición de -1 lo coloca por encima del enlace de Escritorio.

7 feb 2011 20:53:54
Comentarios

Probé con 4 pero es exactamente lo mismo que 5.

wyc wyc
7 feb 2011 21:23:41

Mmm. ¿Probaste con 1-3? Creo que tal vez "1" (o "0") es el Dashboard. Quizás algo como 2-3 podría funcionar

Zack Zack
7 feb 2011 22:32:04

0 1 2 3 van antes del Dashboard y 4 va debajo de Posts. ¡Es realmente imposible!

wyc wyc
8 feb 2011 07:44:43

Vaya. ¿WordPress está muy roto? Entonces no lo sé. :-/

Zack Zack
8 feb 2011 07:52:25

Creo que 4 es el separador justo encima de "Posts", y 5 es "Posts", así que si configuras tu menú en la posición 3 estará justo antes del separador. Con la configuración predeterminada, claro. Configurar mi página de plugin en 4 sobrescribió el separador, pero apareció justo encima de "Posts". Hmmm...

goldenapples goldenapples
28 mar 2011 22:50:43
0

Puedes usar valores decimales (como cadenas). Por ejemplo, tengo algunos tipos de entradas personalizadas que coloqué en la última posición del menú (100001, 100002, 100003).

Luego, simplemente coloca este código para moverlos arriba de Entradas y debajo del elemento de menú Escritorio.

function reorder_admin_menu() {

  global $menu;

  // Añadir un separador

  $menu["3.1"] = array(
    0 =>  '',
    1 =>  'read',
    2 =>  'separator_' . "anything_unique",
    3 =>  '',
    4 =>  'wp-menu-separator'
    );

  // He colocado mis elementos de menú al final (exactamente estos valores), así que los muevo arriba

  $menu["3.2"] = $menu[100001];
  $menu["3.3"] = $menu[100002];
  $menu["3.4"] = $menu[100003];

  unset($menu[100001]);
  unset($menu[100002]);
  unset($menu[100003]);

  // mover el menú Medios (posición 10) al frente, en el mismo grupo
  $menu["3.5"] = $menu[10];
  unset($menu[10]);

  // Depuración: ksort($menu); error_log( var_export( $menu, true ) );
}

add_action( 'admin_menu', 'reorder_admin_menu', 999 );
25 nov 2015 21:09:52