¿Cómo colocar un menú de tipo de entrada personalizada encima del menú de Entradas usando menu_position?
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?
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ú

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?

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?

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.

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

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

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.

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.

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.

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
.

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

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

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

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