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

8 ago 2017, 21:12:43
Visualizzazioni: 49.9K
Voti: 16

Avendo letto altrove su Stack di due plugin WP che forzano posizioni di menu identiche (con la probabilità che uno poi non appaia), mi chiedo come posso controllare la posizione degli elementi di menu aggiunti dai plugin.

Uso già una funzione che sembra gestire tali elementi del sottomenu in 'impostazioni', e un'altra funzione per riordinare gli elementi 'di primo livello' predefiniti (articoli, pagine, temi, plugin, impostazioni, eccetera) - ma che non modifica il posizionamento di tali elementi aggiunti dai plugin.

function custom_menu_order() {
    return array(
        //Aggiungi elementi qui nell'ordine desiderato.
    );
}

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

Come esempio, dei due elementi del menu di primo livello aggiunti da WooCommerce, uno appare sopra l'elemento aggiunto da ContactForm7 e l'altro sotto, e sarebbe bello poterli riordinare di conseguenza - e anche, poter riordinare meglio gli elementi che non forzano una posizione nel menu e invece appaiono in fondo.

Trovo che di solito funziona bene per riordinare gli elementi predefiniti e 'edit.php?post_type=...', ma quelli con 'admin.php?page=...' non si riordinano.

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

E uno ('edit.php?post_type=shop_order') dei CPT di WooCommerce non si riordina - anche se l'altro ('edit.php?post_type=product') lo fa.

0
Tutte le risposte alla domanda 4
3
23

Le risposte esistenti vanno bene, ma se dovessi aggiungere un nuovo tipo di post personalizzato, dovresti modificare quelle funzioni ripetutamente.

Per risolvere questo problema, ho sviluppato questa piccola funzione. Basta definire i tuoi $new_positions all'interno della funzione my_new_menu_order:

/**
 * Attiva il filtro 'menu_order' e poi si aggancia a 'menu_order'
 */
add_filter('custom_menu_order', function() { return true; });
add_filter('menu_order', 'my_new_admin_menu_order');
/**
 * Filtra l'ordine predefinito del menu di WordPress
 */
function my_new_admin_menu_order( $menu_order ) {
  // definisci qui le nuove posizioni desiderate per il menu
  // ad esempio, sposta 'upload.php' alla posizione #9 e le pagine integrate alla posizione #1
  $new_positions = array(
    'upload.php' => 9,
    'edit.php?post_type=page' => 1
  );
  // funzione helper per spostare un elemento all'interno di un array
  function move_element(&$array, $a, $b) {
    $out = array_splice($array, $a, 1);
    array_splice($array, $b, 0, $out);
  }
  // scorri le nuove posizioni e sposta 
  // gli elementi se trovati nel menu_positions originale
  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 ott 2018 15:47:53
Commenti

È fantastico - quindi quando nuovi elementi devono essere aggiunti come voce di menu, come un custom post type (come hai suggerito) o un nuovo plugin o anche una nuova opzione integrata in futuro, verranno aggiunti correttamente come al solito?

Brett Brett
2 gen 2019 23:19:25

@Brett Sembra che funzionerà in questo modo.

Davey Davey
17 lug 2019 17:32:35

Funziona ancora perfettamente - grazie

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

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

menu_position (integer) (opzionale) La posizione nell'ordine del menu in cui dovrebbe apparire il tipo di post. show_in_menu deve essere true.

    Default: null - di default appare sotto Commenti

    5  - sotto Articoli
    10 - sotto Media
    15 - sotto Link
    20 - sotto Pagine
    25 - sotto Commenti
    59 - sotto il primo separatore
    60 - sotto Aspetto
    65 - sotto Plugin
    70 - sotto Utenti
    75 - sotto Strumenti
    80 - sotto Impostazioni
    99 - sotto il secondo separatore

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

nel tuo plugin puoi impostare il livello. se stai cercando di modificare la posizione del menu di un plugin che non hai creato, molti potrebbero averlo reso modificabile, oppure puoi modificare le loro chiamate.

9 ago 2017 01:31:51
Commenti

@ rudtek... grazie. Ne miei CPT personali ho evitato di impostare posizioni del menu, preferendo invece utilizzare un riordino del menu e quindi 'avere tutto nello stesso posto' e più facile da modificare successivamente. Non avendo plugin propri per cui cerco di impostare la posizione del menu, è per plugin di terze parti - per i quali non conosco abbastanza 'pluggable' o per modificare le loro chiamate (che presumibilmente verrebbero sovrascritte con l'aggiornamento).

glvr glvr
9 ago 2017 12:48:16

Fantastico, funziona perfettamente

Jodyshop Jodyshop
25 ott 2021 22:58:06

Puoi anche usare numeri decimali: 25.3

Azamat Azamat
22 ago 2022 09:39:30

File sorgente del core di WordPress per supportare questa risposta (e possibilmente aggiornarla se cambia nel tempo): /wp-admin/menu.php

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

Per modificare l'ordine degli elementi del menu di amministrazione di primo livello, avrai bisogno di due hooks, due filters e una function. Inserisci il seguente codice nel file functions.php del tuo tema attuale:

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

    return array(
        'index.php', // Dashboard
        'separator1', // Primo separatore
        'edit.php', // Articoli
        'upload.php', // Media
        'link-manager.php', // Link
        'edit-comments.php', // Commenti
        'edit.php?post_type=page', // Pagine
        'separator2', // Secondo separatore
        'themes.php', // Aspetto
        'plugins.php', // Plugin
        'users.php', // Utenti
        'tools.php', // Strumenti
        'options-general.php', // Impostazioni
        'separator-last', // Ultimo separatore
    );
}
add_filter( 'custom_menu_order', 'wpse_custom_menu_order', 10, 1 );
add_filter( 'menu_order', 'wpse_custom_menu_order', 10, 1 );

L'array restituito degli elementi del menu di amministrazione di primo livello, sopra rappresentato, mostra gli elementi del menu inseriti dal core, nel loro ordine predefinito. Per includere gli elementi del menu aggiunti dai plugin, dobbiamo aggiungerli a questo array. Supponiamo di avere due plugin aggiunti e attivati (ad esempio: Wordfence e NextCellent Gallery). Prima di tutto, dobbiamo trovare i nomi di questi elementi del menu. Quando clicchiamo sull'elemento del menu di primo livello di Wordfence, l'URL risultante terminerà 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', // Primo separatore
    'edit.php', // Articoli
    'upload.php', // Media
    'link-manager.php', // Link
    'edit-comments.php', // Commenti
    'edit.php?post_type=page', // Pagine
    'separator2', // Secondo separatore
    'themes.php', // Aspetto
    'plugins.php', // Plugin
    'users.php', // Utenti
    'tools.php', // Strumenti
    'separator3', // Terzo separatore
    'options-general.php', // Impostazioni
    'separator-last', // Ultimo separatore
    'Wordfence', // Wordfence
    'nextcellent-gallery-nextgen-legacy', // NextCellent Gallery
);

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

Nota: puoi anche utilizzare il plugin Admin Menu Editor per facili azioni di drag and drop.

9 ago 2017 01:40:36
Commenti

@ Frank P. Walentynowicz ...grazie per la risposta esaustiva. Ho aggiornato il mio post originale per chiarire, e il tuo suggerimento di usare 'la parte dopo ?page=' è molto utile e risolve il mio problema - tranne che per uno dei due elementi WooCommerce.

glvr glvr
9 ago 2017 12:44:18

Aggiunta rapida al mio commento precedente: avevo precedentemente usato Admin Menu Editor, ma preferisco una funzione hardcoded.

glvr glvr
9 ago 2017 12:51:16

Qual è il significato del 10,1? Come in add_filter( 'menu_order', 'wpse_custom_menu_order', 10, 1 ); Non riesco a trovare informazioni su questo. Probabilmente qualcosa di semplice. Ma non riesco a far muovere WooCommerce e mi chiedo se abbia qualcosa a che fare con questo.

WebDude0482 WebDude0482
3 dic 2020 20:16:54
0

Grazie a rassoh per la bella soluzione.

Ecco una versione rivista che contiene un elenco di pagine che probabilmente dovrebbero sempre rimanere in cima...

/**
 * Questi 2 filtri e 1 funzione spostano le pagine predefinite di amministrazione di WordPress
 * in cima così non vengono spinte giù nel menu ogni volta che viene installato un nuovo plugin.
 * Attiva il filtro 'menu_order' e poi si aggancia a 'menu_order'
 */
add_filter('custom_menu_order', function() { return true; });
add_filter('menu_order', 'my_new_admin_menu_order');
/**
 * Filtra l'ordine predefinito del menu di WordPress
 */
function my_new_admin_menu_order( $menu_order ) {
  // definisci qui le nuove posizioni desiderate per il menu
  // ad esempio, sposta 'upload.php' alla posizione #9 e le pagine integrate alla posizione #1
  $new_positions = array(
    'index.php' => 1,  // Pannello di controllo
    'edit.php' => 2,  // Articoli
    'upload.php' => 3,  // Media
    'edit.php?post_type=page' => 4,  // Pagine
    'edit-comments.php' => 5  // Commenti
  );
  // funzione helper per spostare un elemento all'interno di un array
  function move_element(&$array, $a, $b) {
    $out = array_splice($array, $a, 1);
    array_splice($array, $b, 0, $out);
  }
  // scorre le nuove posizioni e sposta 
  // gli elementi se trovati nel menu_order originale
  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 lug 2020 02:43:37