¿Cómo puedo controlar la posición en el menú de administración de los elementos añadidos por plugins?

8 ago 2017, 21:12:43
Vistas: 49.9K
Votos: 16

Después de leer en Stack sobre dos plugins de WordPress que fuerzan posiciones idénticas en el menú (con la probabilidad de que uno no aparezca), me pregunto cómo puedo controlar la posición de los elementos del menú añadidos por plugins.

Ya uso una función que parece manejar dichos elementos del submenú en 'ajustes', y otra función para reordenar los elementos 'de nivel superior' predeterminados (entradas, páginas, temas, plugins, ajustes, etcétera) - pero que no cambia el posicionamiento de los elementos añadidos por plugins.

function custom_menu_order() {
    return array(
    //Añadir elementos aquí en el orden deseado.
    
    );
}

add_filter( 'custom_menu_order', '__return_true' );
add_filter( 'menu_order', 'custom_menu_order' );

Como ejemplo, de los dos elementos del menú de nivel superior añadidos por WooCommerce, uno aparece encima del elemento añadido por ContactForm7 y el otro debajo, y sería bueno poder reordenarlos en consecuencia - y también, poder reordenar mejor los elementos que no fuerzan una posición en el menú y en su lugar aparecen al final.

Encuentro que normalmente funciona bien para reordenar elementos predeterminados y 'edit.php?post_type=...', pero aquellos con 'admin.php?page=...' no se reordenan.

Cuando mi función de reordenamiento está desactivada, los dos elementos de WooCommerce ('edit.php?post_type=product' y 'edit.php?post_type=shop_order') se agrupan juntos como se pretende, pero cuando la función se reactiva quedan separados por ContactForm7 ('admin.php?page=wpcf7').

Y uno ('edit.php?post_type=shop_order') de los CPTs de WooCommerce no se reordena - aunque el otro ('edit.php?post_type=product') sí lo hace.

0
Todas las respuestas a la pregunta 4
3
23

Las respuestas existentes están bien, pero si añades un nuevo tipo de publicación personalizada, tendrías que volver a editar esas funciones una y otra vez.

Para solucionar esto, desarrollé esta pequeña función. Solo define tus $new_positions dentro de la función my_new_menu_order:

/**
 * Activa el filtro 'menu_order' y luego se engancha a 'menu_order'
 */
add_filter('custom_menu_order', function() { return true; });
add_filter('menu_order', 'my_new_admin_menu_order');
/**
 * Filtra el orden de menú predeterminado de WordPress
 */
function my_new_admin_menu_order( $menu_order ) {
  // define aquí tus nuevas posiciones de menú deseadas
  // por ejemplo, mueve 'upload.php' a la posición #9 y las páginas integradas a la posición #1
  $new_positions = array(
    'upload.php' => 9,
    'edit.php?post_type=page' => 1
  );
  // función auxiliar para mover un elemento dentro de un array
  function move_element(&$array, $a, $b) {
    $out = array_splice($array, $a, 1);
    array_splice($array, $b, 0, $out);
  }
  // recorre las nuevas posiciones y mueve
  // los elementos si se encuentran en las menu_positions originales
  foreach( $new_positions as $value => $new_index ) {
    if( $current_index = array_search( $value, $menu_order ) ) {
      move_element($menu_order, $current_index, $new_index);
    }
  }
  return $menu_order;
};
1 oct 2018 15:47:53
Comentarios

Esto es increíble - ¿entonces cuando se agreguen nuevos elementos como ítems de menú, como un tipo de publicación personalizado (como sugeriste), o un nuevo plugin o incluso una nueva opción incorporada en el futuro, se agregarán correctamente como de costumbre?

Brett Brett
2 ene 2019 23:19:25

@Brett Parece que funcionaría así.

Davey Davey
17 jul 2019 17:32:35

Sigue funcionando de maravilla - gracias

Hannah Smith Hannah Smith
21 dic 2021 17:29:54
4
17

cuando estás creando un tipo de publicación con register_post_type() puedes establecer la posición del menú:

menu_position (entero) (opcional) La posición en el orden del menú donde debe aparecer el tipo de publicación. show_in_menu debe ser verdadero.

    Por defecto: null - aparece debajo de Comentarios

    5  - debajo de Entradas
    10 - debajo de Medios
    15 - debajo de Enlaces
    20 - debajo de Páginas
    25 - debajo de Comentarios
    59 - debajo del primer separador
    60 - debajo de Apariencia
    65 - debajo de Plugins
    70 - debajo de Usuarios
    75 - debajo de Herramientas
    80 - debajo de Ajustes
    99 - debajo del segundo separador

Si los elementos tienen la misma posición en el menú, se ordenan alfabéticamente.

en tu propio plugin puedes establecer el nivel. si estás intentando cambiar la posición del menú de un plugin que no has creado, muchos pueden tenerlo modificable, o puedes editar sus llamadas.

9 ago 2017 01:31:51
Comentarios

@rudtek... gracias. En mis propios CPTs he evitado establecer posiciones de menú, prefiriendo en su lugar usar un reordenador de menú y así 'tener todo en el mismo lugar' y facilitar cambios posteriores. Al no tener plugins propios para los que intente establecer posición de menú, es para plugins de terceros - sobre los que no sé lo suficiente sobre 'pluggable' o para editar sus llamadas (que presumiblemente serían sobrescritas en actualizaciones).

glvr glvr
9 ago 2017 12:48:16

Increíble, funciona perfecto

Jodyshop Jodyshop
25 oct 2021 22:58:06

También puedes usar números decimales: 25.3

Azamat Azamat
22 ago 2022 09:39:30

Fuente del archivo principal de WordPress para respaldar esta respuesta (y posiblemente actualizarla si cambia con el tiempo): /wp-admin/menu.php

Talk Nerdy To Me Talk Nerdy To Me
28 jul 2023 18:57:02
3
16

Para cambiar el orden de los elementos del menú de administración de nivel superior, necesitarás dos hooks, dos filters y una function. Coloca el siguiente código en el archivo functions.php de tu tema actual:

function wpse_custom_menu_order( $menu_ord ) {
    if ( !$menu_ord ) return true;

    return array(
        'index.php', // Escritorio
        'separator1', // Primer separador
        'edit.php', // Entradas
        'upload.php', // Medios
        'link-manager.php', // Enlaces
        'edit-comments.php', // Comentarios
        'edit.php?post_type=page', // Páginas
        'separator2', // Segundo separador
        'themes.php', // Apariencia
        'plugins.php', // Plugins
        'users.php', // Usuarios
        'tools.php', // Herramientas
        'options-general.php', // Ajustes
        'separator-last', // Último separador
    );
}
add_filter( 'custom_menu_order', 'wpse_custom_menu_order', 10, 1 );
add_filter( 'menu_order', 'wpse_custom_menu_order', 10, 1 );

El array devuelto de elementos del menú de administración de nivel superior, mostrado arriba, representa los elementos del menú insertados por el núcleo de WordPress en su orden predeterminado. Para incluir elementos del menú añadidos por plugins, debemos agregarlos a este array. Supongamos que tenemos dos plugins añadidos y activados (por ejemplo: Wordfence y NextCellent Gallery). Primero, debemos encontrar los nombres de estos elementos del menú. Cuando hacemos clic en el elemento del menú de nivel superior de Wordfence, la URL resultante terminará con ?page=Wordfence. La parte después de ?page= es nuestro nombre (Wordfence). Para NextCellent Gallery, el nombre será nextcellent-gallery-nextgen-legacy. Ahora, agreguemos estos elementos a nuestro array:

return array(
    'index.php', // Escritorio
    'separator1', // Primer separador
    'edit.php', // Entradas
    'upload.php', // Medios
    'link-manager.php', // Enlaces
    'edit-comments.php', // Comentarios
    'edit.php?post_type=page', // Páginas
    'separator2', // Segundo separador
    'themes.php', // Apariencia
    'plugins.php', // Plugins
    'users.php', // Usuarios
    'tools.php', // Herramientas
    'separator3', // Tercer separador
    'options-general.php', // Ajustes
    'separator-last', // Último separador
    'Wordfence', // Wordfence
    'nextcellent-gallery-nextgen-legacy', // NextCellent Gallery
);

Ahora podemos mover los elementos de este array hacia arriba o hacia abajo para obtener el orden final.

Nota: también puedes usar el plugin Admin Menu Editor para realizar acciones de arrastrar y soltar de manera sencilla.

9 ago 2017 01:40:36
Comentarios

@ Frank P. Walentynowicz... gracias por la respuesta exhaustiva. Actualicé mi publicación original para aclarar, y tu sugerencia de usar 'la parte después de ?page=' es muy útil y resuelve mi problema, excepto por uno de los dos elementos de WooCommerce.

glvr glvr
9 ago 2017 12:44:18

Adición rápida a mi comentario anterior: anteriormente había usado Admin Menu Editor, pero prefiero una función codificada.

glvr glvr
9 ago 2017 12:51:16

¿Cuál es el significado del 10,1? Como en add_filter( 'menu_order', 'wpse_custom_menu_order', 10, 1 ); No puedo encontrar información sobre eso. Probablemente sea algo simple. Pero, no logro que WooCommerce cambie y me pregunto si eso tiene algo que ver.

WebDude0482 WebDude0482
3 dic 2020 20:16:54
0

Gracias a rassoh por esta útil opción.

Aquí hay una versión revisada que contiene una lista de páginas que probablemente siempre deberían permanecer en la parte superior...

/**
 * Estos 2 filtros y 1 función mueven las páginas administrativas integradas de WordPress
 * a la parte superior para que no sean desplazadas en el menú cada vez que se instala un nuevo plugin.
 * Activa el filtro 'menu_order' y luego se engancha a 'menu_order'
 */
add_filter('custom_menu_order', function() { return true; });
add_filter('menu_order', 'my_new_admin_menu_order');
/**
 * Filtra el orden de menú predeterminado de WordPress
 */
function my_new_admin_menu_order( $menu_order ) {
  // define aquí las nuevas posiciones deseadas del menú
  // por ejemplo, mover 'upload.php' a la posición #9 y las páginas integradas a la posición #1
  $new_positions = array(
    'index.php' => 1,  // Escritorio
    'edit.php' => 2,  // Entradas
    'upload.php' => 3,  // Medios
    'edit.php?post_type=page' => 4,  // Páginas
    'edit-comments.php' => 5  // Comentarios
  );
  // función auxiliar para mover un elemento dentro de un array
  function move_element(&$array, $a, $b) {
    $out = array_splice($array, $a, 1);
    array_splice($array, $b, 0, $out);
  }
  // recorre las nuevas posiciones y mueve 
  // los elementos si se encuentran en el menu_order original
  foreach( $new_positions as $value => $new_index ) {
    if( $current_index = array_search( $value, $menu_order ) ) {
      move_element($menu_order, $current_index, $new_index);
    }
  }
  return $menu_order;
};
30 jul 2020 02:43:37