¿Cómo puedo controlar la posición en el menú de administración de elementos agregados por complementos?

8

Después de haber leído en otro lugar en la Pila de dos complementos WP forzando posiciones de menú idénticas (con la probabilidad de que uno no aparezca), me pregunto cómo puedo controlar la posición de los elementos de menú agregados por los complementos.

Ya uso una función que parece manejar tales elementos de submenú en 'configuración', y otra función para reordenar elementos predeterminados (publicaciones, páginas, temas, complementos, configuraciones, etc.) elementos de 'nivel superior', pero que no cambian el posicionamiento de dichos elementos agregados por complementos.

function custom_menu_order() {
return array(
//Add items here in desired order.

);
}

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

Como ejemplo, de los dos elementos de menú de nivel superior agregados por WooCommerce, uno aparece arriba del elemento agregado por ContactForm7 y el otro a continuación, y sería bueno reordenarlos en consecuencia, y también, para poder reordenar mejor los elementos que no fuerzan una posición del menú y en su lugar aparecen en la parte inferior.

Creo que generalmente funciona bien para reordenar elementos predeterminados y 'edit.php? Post_type = ...', pero aquellos con 'admin.php? Page = ...' no reordenan.

Cuando mi función de reordenamiento está deshabilitada, los dos elementos de WooCommerce ('edit.php? Post_type = product' y 'edit.php? Post_type = shop_order') se agrupan según lo previsto, pero cuando la función se reactiva se dividen por ContactForm7 ('admin.php? page = wpcf7').

Y, uno ('edit.php? Post_type = shop_order') de los CPT de WooCommerce no se reordenará, aunque el otro ('edit.php? Post_type = product') sí.

glvr
fuente

Respuestas:

8

Para cambiar el orden de los elementos del menú de administración de nivel superior, necesitará dos hooks, dos filtersy uno function. Ponga el siguiente código en su tema actual functions.php:

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

    return array(
        'index.php', // Dashboard
        'separator1', // First separator
        'edit.php', // Posts
        'upload.php', // Media
        'link-manager.php', // Links
        'edit-comments.php', // Comments
        'edit.php?post_type=page', // Pages
        'separator2', // Second separator
        'themes.php', // Appearance
        'plugins.php', // Plugins
        'users.php', // Users
        'tools.php', // Tools
        'options-general.php', // Settings
        'separator-last', // Last separator
    );
}
add_filter( 'custom_menu_order', 'wpse_custom_menu_order', 10, 1 );
add_filter( 'menu_order', 'wpse_custom_menu_order', 10, 1 );

La matriz devuelta de elementos de menú de administrador de nivel superior, arriba, representa elementos de menú insertados por núcleo, en su orden predeterminado. Para incluir elementos de menú agregados por complementos, debemos agregarlos a esta matriz. Digamos que tenemos dos complementos agregados y activados (por ejemplo: Wordfencey NextCellent Gallery). Tenemos que encontrar los nombres de estos elementos del menú, primero. Cuando hacemos clic en Wordfenceel elemento del menú de nivel superior, la URL resultante finalizará con ?page=Wordfence. La parte posterior ?page=es nuestro nombre ( Wordfence). Para NextCellent Gallery, el nombre será nextcellent-gallery-nextgen-legacy. Ahora, agreguemos estos elementos a nuestra matriz:

return array(
    'index.php', // Dashboard
    'separator1', // First separator
    'edit.php', // Posts
    'upload.php', // Media
    'link-manager.php', // Links
    'edit-comments.php', // Comments
    'edit.php?post_type=page', // Pages
    'separator2', // Second separator
    'themes.php', // Appearance
    'plugins.php', // Plugins
    'users.php', // Users
    'tools.php', // Tools
    'separator3', // Third separator
    'options-general.php', // Settings
    'separator-last', // Last separator
    'Wordfence', // Wordfence
    'nextcellent-gallery-nextgen-legacy', // NextCellent Gallery
);

Podemos, ahora, mover elementos de esta matriz, arriba y abajo, para obtener el orden final.

Nota : también puede usar el complemento Editor del menú de administración para realizar acciones fáciles de arrastrar y soltar.

Frank P. Walentynowicz
fuente
1
@ Frank P. Walentynowicz ... gracias por la respuesta integral. Actualicé mi publicación original para aclarar, y su sugerencia de usar 'the after after? Page =' es muy útil y resuelve mi problema, excepto uno de los dos elementos de WooCommerce.
glvr
Adición rápida a mi comentario anterior: anteriormente había usado el Editor del menú de administración, pero prefiero una función codificada.
glvr
11

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

Para solucionar esto, desarrollé esta pequeña función. Simplemente defina su $new_positionsinterior de la my_new_menu_orderfunción:

/**
 * Activates the 'menu_order' filter and then hooks into 'menu_order'
 */
add_filter('custom_menu_order', function() { return true; });
add_filter('menu_order', 'my_new_admin_menu_order');
/**
 * Filters WordPress' default menu order
 */
function my_new_admin_menu_order( $menu_order ) {
  // define your new desired menu positions here
  // for example, move 'upload.php' to position #9 and built-in pages to position #1
  $new_positions = array(
    'upload.php' => 9,
    'edit.php?post_type=page' => 1
  );
  // helper function to move an element inside an array
  function move_element(&$array, $a, $b) {
    $out = array_splice($array, $a, 1);
    array_splice($array, $b, 0, $out);
  }
  // traverse through the new positions and move 
  // the items if found in the original menu_positions
  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;
};
rassoh
fuente
1
Esto es increíble, por lo que cuando se agreguen nuevos elementos como un elemento de menú, como un tipo de publicación personalizada (como sugirió) o un nuevo complemento o incluso una nueva opción incorporada en el futuro, se agregará perfectamente como de costumbre. ?
Brett
@ Brett Parece que funcionaría así.
Davey
6

Cuando crea un tipo de publicación con register_post_type (), puede establecer la posición del menú:

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

    Default: null - defaults to below Comments 

    5 - below Posts
    10 - below Media
    15 - below Links
    20 - below Pages
    25 - below comments
    60 - below first separator
    65 - below Plugins
    70 - below Users
    75 - below Tools
    80 - below Settings
    100 - below second separator

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

en su propio complemento puede establecer el nivel. Si está intentando cambiar la posición del menú de un complemento que no ha creado, muchos de ellos pueden tenerlo conectable, o puede editar sus llamadas.

Rudtek
fuente
@ Rudtek ... gracias. En mis propios CPT, he evitado establecer posiciones de menú, prefiero usar un reordenamiento de menú y, por lo tanto, "tenerlo todo en el mismo lugar" y es más fácil cambiarlo posteriormente. Al no tener complementos propios para los que estoy tratando de establecer la posición del menú, es para complementos de terceros, para los cuales no sé lo suficiente sobre 'conectables' o para editar sus llamadas (que presumiblemente se sobrescribirán en la actualización).
glvr