Come posso controllare la posizione nel menu amministrativo degli elementi aggiunti dai plugin?
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.

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

È 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?

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.

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

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

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.

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

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

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.

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