Come rimuovere le pagine del menu amministratore inserite dai plugin?
Ho il seguente codice, che rimuove molti elementi che non verranno utilizzati nell'area di amministrazione:
add_action( 'admin_menu', 'my_remove_menu_pages' );
function my_remove_menu_pages() {
remove_menu_page( 'edit.php' ); //Articoli
remove_menu_page( 'upload.php' ); //Media
remove_menu_page( 'edit-comments.php' ); //Commenti
remove_menu_page( 'themes.php' ); //Aspetto
remove_menu_page( 'users.php' ); //Utenti
remove_menu_page( 'tools.php' ); //Strumenti
remove_menu_page( 'options-general.php' ); //Impostazioni
};
Tuttavia, ci sono due voci di menu che sono state inserite dai plugin.
Quando passo il mouse su ciascuna voce di menu, i link mostrati sono:
/wp-admin/edit.php?post_type=acf
/wp-admin/admin.php?page=wpcf7
C'è un modo per nascondere anche queste pagine del menu?

Devi utilizzare i hook corretti (che non sempre corrispondono agli URL/slug), e non fa male usare un hook che viene eseguito più tardi (ad esempio, admin_init
):
add_action( 'admin_init', 'wpse_136058_remove_menu_pages' );
function wpse_136058_remove_menu_pages() {
remove_menu_page( 'edit.php?post_type=acf' );
remove_menu_page( 'wpcf7' );
}
Puoi utilizzare il seguente codice per il debug:
add_action( 'admin_init', 'wpse_136058_debug_admin_menu' );
function wpse_136058_debug_admin_menu() {
echo '<pre>' . print_r( $GLOBALS[ 'menu' ], TRUE) . '</pre>';
}
Questo restituisce (per la mia configurazione) il seguente risultato per la pagina del menu del plugin Contact Form 7:
[27] => Array
(
[0] => Modulo
[1] => wpcf7_read_contact_forms
[2] => wpcf7
[3] => Contact Form 7
[4] => menu-top menu-icon-generic toplevel_page_wpcf7 menu-top-last
[5] => toplevel_page_wpcf7
[6] => none
)
L'elemento dell'array con chiave 2
è quello che stai cercando: wpcf7
.

Mostrare come scaricare il menu e trovare cosa usare per remove_menu_page()
è stato di enorme aiuto — mi ha insegnato a pescare invece di semplicemente darmi il pesce!

Per acf c'è un approccio migliore, vedi la documentazione

// PLUGIN CHE AGGIUNGONO SOTTOMENU NELLA DASHBOARD
// SE QUESTO È L'URL SOTTOSTANTE - LA VARIABILE PAGE È QUELLA CHE MI SERVE (QUALUNQUE COSA SIA DOPO PAGE= )
// http://example.com/wp-admin/index.php?page=iconize-plugin-update-notifier
remove_submenu_page( 'index.php', 'iconize-plugin-update-notifier' );
// O PER ESEMPIO I SOTTOMENU DELLA DASHBOARD DI WOOCOMMERCE
remove_submenu_page( 'index.php', 'wc-about' ); //WOO
remove_submenu_page( 'index.php', 'wc-credits' ); //WOO
remove_submenu_page( 'index.php', 'wc-translators' ); //WOO
// MENU PRINCIPALI DI CUSTOM POST TYPE
remove_menu_page( 'edit.php?post_type={$POST_TYPE}' ); //CERCA CIÒ CHE VIENE DOPO POST TYPE NELL'URL
remove_menu_page( 'edit.php?post_type=testimonials-widget' ); //TESTIMONIALS WIDGET
remove_menu_page( 'edit.php?post_type=product' ); //WOOCOMMERCE
// SOTTOMENU DI CUSTOM POST TYPE
remove_submenu_page( 'edit.php?post_type={$POST_TYPE}', '{$SUBMENU_URL_VARIABLE}' ); //FORMATO ESEMPIO
// QUINDI SE L'URL È IL SEGUENTE
// http://example.com/wp-admin/edit.php?post_type=testimonials-widget&page=testimonialswidget_settings
// DEVI VEDERE CIÒ CHE VIENE DOPO PAGE
remove_submenu_page( 'edit.php?post_type=testimonials-widget', 'testimonialswidget_settings' ); //TESTIMONIALS WIDGET
// ALTRI ESEMPI
remove_menu_page( 'revslider' ); // REVSLIDER
remove_menu_page( 'woocommerce' ); // WOOCOMMERCE
remove_menu_page( 'order-post-types-shop_order' ); // WOOCOMMERCE
remove_menu_page( 'order-post-types-shop_coupons' ); // WOOCOMMERCE
remove_menu_page( 'shortcodes-ultimate' ); // SHORTCODES ULTIMATE
remove_menu_page( 'wp-admin-microblog/wp-admin-microblog.php' ); // ADMIN MICROBLOG
remove_menu_page( 'snippets' ); //CODE SNIPPETS
remove_menu_page( 'gf_edit_forms' ); // GRAVITY FORMS
remove_submenu_page( 'gf_edit_forms', 'gf_settings' ); // GRAVITY FORMS
remove_submenu_page( 'gf_edit_forms', 'gf_export' ); // GRAVITY FORMS
remove_submenu_page( 'gf_edit_forms', 'gf_update' ); // GRAVITY FORMS
remove_submenu_page( 'gf_edit_forms', 'gf_addons' ); // GRAVITY FORMS
remove_submenu_page( 'gf_edit_forms', 'gf_help' ); // GRAVITY FORMS
remove_submenu_page( 'cleverness-to-do-list', 'cleverness-to-do-list-settings' ); //Cleverness TODO
PUOI DEBUGGARE TUTTO QUESTO CON IL SEGUENTE CODICE PER OTTENERE TUTTE LE INFORMAZIONI NECESSARIE:
if (!function_exists('debug_admin_menus')):
function debug_admin_menus() {
if ( !is_admin())
return;
global $submenu, $menu, $pagenow;
if ( current_user_can('manage_options') ) { // SOLO PER AMMINISTRATORI
if( $pagenow == 'index.php' ) { // STAMPA NELLA DASHBOARD
echo '<pre>'; print_r( $menu ); echo '</pre>'; // MENU PRINCIPALI
echo '<pre>'; print_r( $submenu ); echo '</pre>'; // SOTTOMENU
}
}
}
add_action( 'admin_notices', 'debug_admin_menus' );
endif;
Le chiavi ti forniranno i valori dell'array che ti permettono di fare tutto questo con le variabili globali di WordPress (sebbene non sia raccomandato)
function remove_submenus_all_please() {
if ( !is_admin())
return;
global $submenu;
unset($submenu['index.php'][10]); // Rimuove Aggiornamenti
//Menu Articoli
// unset($submenu['edit.php'][5]); // Porta all'elenco degli articoli disponibili da modificare
// unset($submenu['edit.php'][10]); // Aggiungi nuovo articolo
// unset($submenu['edit.php'][15]); // Rimuovi categorie
// unset($submenu['edit.php'][16]); // Rimuove i tag degli articoli
}
add_action('admin_menu', 'remove_submenus_all_please', 999);
E per rimuovere per determinati utenti basta fare la stessa cosa ma aggiungendo i permessi:
function remove_by_caps_admin_menu() {
if ( !is_admin())
return;
if ( !current_user_can('manage_options') ) {
remove_menu_page( 'revslider' ); // REVSLIDER
} elseif ( !current_user_can('edit_posts') ) {
remove_menu_page( 'woocommerce' ); // WOO
} else {
}
}
add_action('admin_menu', 'remove_by_caps_admin_menu', 999);
E PER UNIRE TUTTO INSIEME PERCHÉ NON ACCORCIARE IL NOSTRO CODICE? PUOI USARE GLI ARRAY PER EVITARE DI SCRIVERE remove_submenu_page 50 VOLTE. Funziona anche con i nodi della toolbar:
if ( !function_exists( 'remove_admin_menupages_in_array' ) ) {
function remove_admin_menupages_in_array() {
if ( !is_admin())
return;
$admin_menus = array(
'revslider',
'woocommerce',
'shortcodes-ultimate',
);
foreach ( $admin_menus as $menu_page ) {
if ( !current_user_can('manage_options') ) {
remove_menu_page( $menu_page );
}
} // foreach
} // function
add_action('admin_menu', 'remove_admin_menupages_in_array', 9999);
} // exists

Probabilmente è necessario impostare la priorità di add_action
priority su un numero più alto e specificare i due nuovi link in questo modo:
add_action( 'admin_menu', 'my_remove_menu_pages', 999 );
function my_remove_menu_pages() {
remove_menu_page( 'edit.php' ); //Articoli
remove_menu_page( 'upload.php' ); //Media
remove_menu_page( 'edit-comments.php' ); //Commenti
remove_menu_page( 'themes.php' ); //Aspetto
remove_menu_page( 'users.php' ); //Utenti
remove_menu_page( 'tools.php' ); //Strumenti
remove_menu_page( 'options-general.php' ); //Impostazioni
remove_menu_page( 'edit.php?post_type=acf' );
remove_menu_page( 'wpcf7' );
};
Advanced Custom Fields fornisce anche un documento di aiuto su come fare questo per il loro menu qui:
http://www.advancedcustomfields.com/resources/how-to/how-to-hide-acf-menu-from-clients/
Anche Contact Form 7 ha il suo modo per limitare la visibilità del menu:
http://contactform7.com/restricting-access-to-the-administration-panel/

Aggiornamento
Ho creato uno snippet di codice con una funzione più robusta che gestisce sia i menu principali che le voci dei sottomenu.
Risposta originale
Invece di specificare i menu che vuoi rimuovere, specifica i menu che vuoi mantenere :)
add_action('admin_init', 'nwcm_admin_init');
function nwcm_admin_init()
{
// Rimuove i menu non necessari
$menus_to_stay = array(
// Client manager
'nwcm',
// Dashboard
'index.php',
// Utenti
'users.php'
);
foreach ($GLOBALS['menu'] as $key => $value) {
if (!in_array($value[2], $menus_to_stay)) remove_menu_page($value[2]);
}
}
In questo modo non devi cercare i nomi dei plugin e modificare il codice quando aggiungi nuovi plugin..

Certo, puoi specificare solo gli elementi che vuoi rimuovere. Dai un'occhiata al codice qui sotto:
/wordpress/wp-content/plugins/your_plugin/your_plugin.php :
add_action('admin_init', 'nwcm_admin_init');
function nwcm_admin_init()
{
// Rimuovi menu non necessari
$menus_to_remove = array(
// elementi del menu che vuoi rimuovere
'menu_item_1',
'menu_item_2',
.
.
'menu_item_n'
);
// Per evitare messaggi di warning, verifica se 'menu' è impostato E se è un array
if(isset($GLOBALS['menu']) && is_array($GLOBALS['menu'])) {
foreach ($GLOBALS['menu'] as $key => $value) {
//Rimuovi il '!' nella condizione 'if'.
if (in_array($value[2], $menus_to_remove)) remove_menu_page($value[2]);
}
}
}
Questo è semplicemente il negativo del metodo di numediaweb. Grazie @numediaweb. Funziona perfettamente.
P.S.: 'menu_item_1/n' -> posiziona il mouse sopra l'elemento del menu e prendi l'esatta pagina di quell'elemento mostrato nel link.
