Come posso controllare la posizione nel menu di amministrazione degli elementi aggiunti dai plugin?


8

Avendo letto altrove su Stack di due plugin WP forzando posizioni di menu identiche (con la probabilità che una non appaia), mi chiedo come posso controllare la posizione delle voci di menu aggiunte dai plugin.

Uso già una funzione che sembra gestire tali voci di sottomenu in "Impostazioni" e un'altra funzione per riordinare le voci "di livello superiore" predefinite (post, pagine, temi, plugin, impostazioni, ecc.), Ma che non cambia il posizionamento di tali elementi aggiunti dai plugin.

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

Ad esempio, delle due voci di menu di livello superiore aggiunte da WooCommerce, una appare sopra la voce aggiunta da ContactForm7 e l'altra sotto, e sarebbe bello riordinarli di conseguenza - e anche, per essere in grado di riordinare meglio le voci che non forza una posizione del menu e appare invece in basso.

Trovo che di solito funzioni bene per riordinare gli elementi predefiniti e 'edit.php? Post_type = ...', ma quelli con 'admin.php? Page = ...' non riordinano.

Quando la mia funzione di riordino è disabilitata, i due articoli WooCommerce ('edit.php? Post_type = product' e 'edit.php? Post_type = shop_order') si raggruppano come previsto, ma quando la funzione viene riattivata vengono divisi di ContactForm7 ('admin.php? page = wpcf7').

E uno ('edit.php? Post_type = shop_order') dei CPT di WooCommerce non verrà riordinato, anche se l'altro ('edit.php? Post_type = product') lo fa.

Risposte:


8

Per modificare l'ordine delle voci del menu di amministrazione di livello superiore, avrai bisogno di due hooks, due filterse uno function. Inserisci il codice seguente nel tuo tema attuale 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 );

L'array restituito delle voci di menu di amministrazione di livello superiore, sopra, rappresenta le voci di menu inserite per core, nel loro ordine predefinito. Per includere le voci di menu aggiunte dai plugin, dobbiamo aggiungerle a questo array. Diciamo che abbiamo due plugin aggiunti e attivati ​​(ad esempio: Wordfencee NextCellent Gallery). Dobbiamo prima trovare i nomi di queste voci di menu. Quando facciamo clic sulla Wordfencevoce di menu di livello superiore, l'URL risultante termina con ?page=Wordfence. La parte dopo ?page=è il nostro nome ( Wordfence). Per NextCellent Gallery, il nome sarà nextcellent-gallery-nextgen-legacy. Ora, aggiungiamo questi elementi al nostro array:

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

Ora possiamo spostare gli articoli di questo array, su e giù, per ottenere l'ordine finale.

Nota : è possibile utilizzare il plug-in Editor menu amministratore , anche per le azioni di trascinamento della selezione.


1
@ Frank P. Walentynowicz ... grazie per la risposta esaustiva. Ho chiarito il mio post originale per chiarire e il tuo suggerimento di utilizzare "la parte dopo? Page =" è molto utile e risolve il mio problema, ad eccezione di uno dei due elementi di WooCommerce.
Glvr

Rapida aggiunta al mio commento sopra: avevo precedentemente usato l'Editor del menu Admin, ma preferivo una funzione hardcoded.
glvr

11

Le risposte esistenti vanno bene, ma se si aggiunge un nuovo tipo di post personalizzato, è necessario modificare nuovamente tali funzioni.

Per risolvere questo problema, ho sviluppato questa piccola funzione. Basta definire la tua funzione $new_positionsinterna my_new_menu_order:

/**
 * 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;
};

1
Questo è fantastico - quindi quando nuovi elementi devono essere aggiunti come voci di menu come un tipo di post personalizzato (come hai suggerito) o un nuovo plug-in o anche una nuova opzione integrata in futuro, verranno aggiunti bene come al solito ?
Brett,

@Brett Sembra che funzioni così.
Davey,

6

quando crei un tipo di post con register_post_type () puoi impostare la posizione del menu:

menu_position (numero intero) (opzionale) La posizione nell'ordine di menu dovrebbe apparire il tipo di post. show_in_menu deve essere vero.

    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

Se gli elementi hanno la stessa posizione nel menu, vengono ordinati alfabeticamente.

nel tuo plugin puoi impostare il livello. se stai provando a cambiare la posizione del menu di un plugin che non hai creato, molti di loro potrebbero averlo collegabile o puoi modificare le loro chiamate.


@ rudtek ... grazie. Nei miei CPT ho evitato di impostare le posizioni dei menu, preferendo invece utilizzare un riordino dei menu e quindi 'avere tutto nello stesso posto' e più facile cambiare successivamente. Non avendo plugin propri per i quali sto cercando di impostare la posizione del menu, è per plugin di terze parti - per i quali non so abbastanza su "collegabile" o per modificare le loro chiamate (che presumibilmente verrebbero sovrascritte al momento dell'aggiornamento).
Glvr
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.