Comment supprimer les pages du menu administrateur insérées par les plugins?

39

J'ai le code suivant, qui nettoie beaucoup de choses qui ne seront pas utilisées dans la zone d'administration:

add_action( 'admin_menu', 'my_remove_menu_pages' );

function my_remove_menu_pages() {
  remove_menu_page( 'edit.php' );                   //Posts
  remove_menu_page( 'upload.php' );                 //Media
  remove_menu_page( 'edit-comments.php' );          //Comments
  remove_menu_page( 'themes.php' );                 //Appearance
  remove_menu_page( 'users.php' );                  //Users
  remove_menu_page( 'tools.php' );                  //Tools
  remove_menu_page( 'options-general.php' );        //Settings

};

Cependant, deux éléments de menu ont été insérés à partir de plugins.

Lorsque je survole chaque élément du menu, il est indiqué que les liens sont les suivants:

/wp-admin/edit.php?post_type=acf
/wp-admin/admin.php?page=wpcf7

Est-il possible de cacher ces pages de menu aussi?

tmyie
la source
C'est peut-être stupide de demander, mais pourquoi pirater le menu administrateur, alors que vous pouvez désactiver les plugins en question?
eyoung100
5
@ eyoung100 Il y a plusieurs raisons. La plus évidente serait de cacher certaines fonctionnalités à des utilisateurs (rôles) spécifiques. De plus, on peut vouloir restructurer le menu admin, et donc avoir besoin de supprimer (et de rajouter) certaines entrées de menu.
tfrommen
Si vous voulez utiliser une solution via le codage, un plugin est une aide contextuelle, comme le plugin 'Adminimize'. La liste du plug-in contient également les slugs qu'il est nécessaire de supprimer via un code personnalisé si les paramètres du plug-in ne vous conviennent pas.
Bueltge

Réponses:

61

Vous devez utiliser les bons hooks (qui ne sont pas toujours identiques aux URL / slugs), et utiliser un hook qui fonctionne plus tard (par exemple, cela ne fait pas de mal 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' );
}

Vous pouvez utiliser les éléments suivants pour déboguer:

add_action( 'admin_init', 'wpse_136058_debug_admin_menu' );

function wpse_136058_debug_admin_menu() {

    echo '<pre>' . print_r( $GLOBALS[ 'menu' ], TRUE) . '</pre>';
}

Ceci donne (pour ma configuration) ce qui suit pour la page de menu du plugin Contact Form 7:

[27] => Array
        (
            [0] => Formular
            [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'élément de tableau avec la clé 2est ce que vous cherchez: wpcf7.

tfrommen
la source
5
Il remove_menu_page()m'a été très utile de montrer comment vider le menu et trouver quoi utiliser . Cela m'a appris à pêcher au lieu de me donner le poisson!
Matthew Clark
Pour acf, il existe une meilleure approche, voir la documentation
hitautodestruct
Le code de débogage est d'une grande aide. Merci une tonne pour le partage!
Devner
17
    // PLUGINS THAT ADD AS DASHBOARD SUBMENU
    // IF THIS IS THE URL BELOW - THE PAGE VARIABLE IS WHAT I NEED ( SO WHATEVER COMES AFTER PAGE= )
    // http://example.com/wp-admin/index.php?page=iconize-plugin-update-notifier
    remove_submenu_page( 'index.php', 'iconize-plugin-update-notifier' );

    // OR FOR EXAMPLE WOOCOMMERCE DASHBOARD SUBMENU
    remove_submenu_page( 'index.php', 'wc-about' ); //WOO
    remove_submenu_page( 'index.php', 'wc-credits' ); //WOO
    remove_submenu_page( 'index.php', 'wc-translators' ); //WOO

    // CUSTOM POST TYPE TOP LEVELS
    remove_menu_page( 'edit.php?post_type={$POST_TYPE}' ); //LOOK FOR WHAT COMES AFTER POST TYPE IN THE URL
    remove_menu_page( 'edit.php?post_type=testimonials-widget' ); //TESTIMONIALS WIDGET
    remove_menu_page( 'edit.php?post_type=product' ); //WOOCOMMERCE

    // CUSTOM POST TYPE SUBMENU
     remove_submenu_page( 'edit.php?post_type={$POST_TYPE}', '{$SUBMENU_URL_VARIABLE}' ); //EXAMPLE FORMAT
     // SO IF BELOW IS THE URL
     // http://example.com/wp-admin/edit.php?post_type=testimonials-widget&page=testimonialswidget_settings
     // YOU NEED TO SEE WHATS AFTER PAGE
     remove_submenu_page( 'edit.php?post_type=testimonials-widget', 'testimonialswidget_settings' ); //TESTIMONIALS WIDGET

    // OTHER EXAMPLES
    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

VOUS POUVEZ DÉBOGER TOUT CELA AVEC CE QUI SUIT POUR OBTENIR TOUTES LES INFORMATIONS DONT VOUS AVEZ BESOIN:

if (!function_exists('debug_admin_menus')):
function debug_admin_menus() {
if ( !is_admin())
        return;
    global $submenu, $menu, $pagenow;
    if ( current_user_can('manage_options') ) { // ONLY DO THIS FOR ADMIN
        if( $pagenow == 'index.php' ) {  // PRINTS ON DASHBOARD
            echo '<pre>'; print_r( $menu ); echo '</pre>'; // TOP LEVEL MENUS
            echo '<pre>'; print_r( $submenu ); echo '</pre>'; // SUBMENUS
        }
    }
}
add_action( 'admin_notices', 'debug_admin_menus' );
endif;

Les clés vous donneront les valeurs de tableau qui vous permettent de faire tout cela avec les globales wordpress (bien que cela ne soit pas recommandé)

function remove_submenus_all_please() {
if ( !is_admin())
        return;
  global $submenu;
    unset($submenu['index.php'][10]); // Removes Updates
  //Posts menu
 // unset($submenu['edit.php'][5]); // Leads to listing of available posts to edit
 // unset($submenu['edit.php'][10]); // Add new post
 // unset($submenu['edit.php'][15]); // Remove categories
 // unset($submenu['edit.php'][16]); // Removes Post Tags
}
add_action('admin_menu', 'remove_submenus_all_please', 999);

Et pour supprimer pour certains utilisateurs, il suffit de faire la même chose sauf avec des fonctionnalités ajoutées:

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

Et pour tout lier ensemble Pourquoi ne pas raccourcir notre code? VOUS POUVEZ UTILISER DES RÉSEAUX POUR ÉVITER L’ÉCRITURE remove_submenu_page 50 fois. Cela fonctionne aussi avec les nœuds de la barre d’outils:

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
Bryan Willis
la source
15

Vous devrez probablement définir la priorité add_action sur un nombre plus élevé et cibler ces deux nouveaux liens de manière spécifique:

add_action( 'admin_menu', 'my_remove_menu_pages', 999 );

function my_remove_menu_pages() {
  remove_menu_page( 'edit.php' );                   //Posts
  remove_menu_page( 'upload.php' );                 //Media
  remove_menu_page( 'edit-comments.php' );          //Comments
  remove_menu_page( 'themes.php' );                 //Appearance
  remove_menu_page( 'users.php' );                  //Users
  remove_menu_page( 'tools.php' );                  //Tools
  remove_menu_page( 'options-general.php' );        //Settings
  remove_menu_page( 'edit.php?post_type=acf' );
  remove_menu_page( 'wpcf7' );
};

Advanced Custom Fields fournit également un document d’aide sur la procédure à suivre pour cela dans leur menu:

http://www.advancedcustomfields.com/resources/how-to/how-to-hide-acf-menu-from-clients/

Le formulaire de contact 7 a également sa propre façon de restreindre la visibilité du menu:

http://contactform7.com/restricting-access-to-the-administration-panel/

hereswhatididid
la source
cachant contactform7 travaillé pour moi en utilisantremove_menu_page( 'wpcf7' );
Abel Melquiades Callejo
8

Mise à jour

J'ai créé un extrait de code avec une fonction plus robuste, qui traite à la fois des menus principaux et des éléments de sous-menus.

Réponse originale

Au lieu de spécifier les menus que vous souhaitez supprimer, spécifiez les menus que vous souhaitez conserver :)

add_action('admin_init', 'nwcm_admin_init');

function nwcm_admin_init()
{   
    // Remove unnecessary menus 
    $menus_to_stay = array(
        // Client manager
        'nwcm',

        // Dashboard
        'index.php',

        // Users
        'users.php'
    );      
    foreach ($GLOBALS['menu'] as $key => $value) {          
        if (!in_array($value[2], $menus_to_stay)) remove_menu_page($value[2]);
    }   

} 

De cette façon, vous n'avez pas besoin de rechercher des noms de plugins ni de modifier le code lorsque vous ajoutez de nouveaux plugins.

numediaweb
la source
Exactement ce que je cherchais! Aussi, votre extrait de code semble être un excellent! Merci beaucoup d'avoir ajouté votre solution. Appréciez le!
Devner
5

Vous devez trouver le bon $ menu_slug. Le code suivant a fonctionné pour moi:

add_action( 'admin_init', 'remove_menus' );
function remove_menus(){
  remove_menu_page( 'wpcf7' );
}
Vincent Wong
la source
4

Bien sûr, vous ne pouvez spécifier que les éléments que vous souhaitez supprimer. Regardez dans le code ci-dessous:

/wordpress/wp-content/plugins/your_plugin/your_plugin.php :


add_action('admin_init', 'nwcm_admin_init');

function nwcm_admin_init()
{   
// Remove unnecessary menus 
$menus_to_remove = array(
    // menu items you want to remove
    'menu_item_1',
    'menu_item_2',
    .
    .
    'menu_item_n'
);     

// To avoid warning message, check whether 'menu' is set AND is an array
if(isset($GLOBALS['menu']) && is_array($GLOBALS['menu'])) {
   foreach ($GLOBALS['menu'] as $key => $value) {  
     //Remove the '!' in the 'if' condition.        
     if (in_array($value[2], $menus_to_remove)) remove_menu_page($value[2]);
   }
}   

} 

Ceci est juste le négatif de la méthode de numediaweb. Merci @numediaweb. Ça fonctionne bien.

PS: 'menu_item_1 / n' -> pointez la souris sur l’option de menu et récupérez la page exacte de cette option de menu affichée dans le lien.

Prabhu Chelladurai
la source
0

utiliser cet extrait de code

function your_custom_name() {    
    remove_menu_page('vc-general'); //the slug as seen wp-admin.php?page=vc-general  
}    
add_action( 'admin_init', 'your_custom_name' );
DoubleAsam
la source
Veuillez modifier votre réponse et ajouter une explication: pourquoi cela pourrait-il résoudre le problème?
fuxia