Wie entferne ich Admin-Menüseiten, die von Plugins eingefügt wurden?

39

Ich habe den folgenden Code, der viele Dinge aufräumt, die nicht im Admin-Bereich verwendet werden:

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

};

Es gibt jedoch zwei Menüpunkte, die aus Plugins eingefügt wurden.

Wenn ich den Mauszeiger über jeden Menüpunkt bewege, werden folgende Links angezeigt:

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

Gibt es eine Möglichkeit, diese Menüseiten auch auszublenden?

tmyie
quelle
Es mag blöd sein zu fragen, aber warum hackt man das Admin-Menü, wenn man die fraglichen Plugins deaktivieren könnte?
Eyoung100
5
@ eyoung100 Es gibt mehrere Gründe. Am offensichtlichsten wäre es, bestimmte Funktionen vor bestimmten Benutzern (Rollen) zu verbergen . Möglicherweise möchten Sie auch das Admin-Menü neu strukturieren und müssen daher bestimmte Menüeinträge entfernen (und wieder hinzufügen).
23.
Wenn Sie eine Lösung per Codierung verwenden würden, wäre ein Plugin ein Helfer im Kontext, wie das Plugin 'Adminimize'. In der Plugin-Liste sind auch die Slugs aufgeführt, die über benutzerdefinierten Code entfernt werden müssen, wenn die Einstellungen des Plugins nicht Ihren Anforderungen entsprechen.
Bueltge

Antworten:

61

Sie müssen die richtigen Hooks verwenden (die nicht immer mit den URLs / Slugs identisch sind), und es tut nicht weh, einen Hook zu verwenden, der später ausgeführt wird (z. B. 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' );
}

Sie können Folgendes zum Debuggen verwenden:

add_action( 'admin_init', 'wpse_136058_debug_admin_menu' );

function wpse_136058_debug_admin_menu() {

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

Dies gibt (für mein Setup) Folgendes für die Menüseite des Contact Form 7-Plugins:

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

Das Array - Element mit Schlüssel 2ist , was Sie suchen: wpcf7.

tfrommen
quelle
5
Es remove_menu_page()war eine große Hilfe, zu zeigen, wie man das Menü auswirft und wofür man es verwendet. Mir wurde beigebracht, wie man fischt, anstatt mir nur den Fisch zu geben!
Matthew Clark
Für acf gibt es einen besseren Ansatz finden Sie in der Dokumentation
hitautodestruct
Der Debug-Code ist eine große Hilfe. Vielen Dank für das Teilen!
Devner
16
    // 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

SIE KÖNNEN ALLES MIT DEM FOLGENDEN DEBUGGEN, UM ALLE INFOS ZU ERHALTEN, DIE SIE BENÖTIGEN:

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;

Mit den Tasten erhalten Sie die Array-Werte, mit denen Sie all dies mit WordPress-Globals ausführen können (obwohl dies nicht empfohlen wird).

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

Und um für bestimmte Benutzer zu entfernen, gehen Sie genauso vor, außer mit den hinzugefügten Funktionen:

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

UND UM ALLES ZUSAMMENZUSAMMENZUSAMMENZUSAMMENZUSAMMENZUSAMMENZUSAMMENZUSAMMENZUSAMMENZUSAMMENZUSAMMENZUSAMMENZUSAMMENZUSAMMENZUSAMMENZIEHEN, WARUM UNSER CODE NICHT KÜRZEN? SIE KÖNNEN ARRAYS VERWENDEN, um das Schreiben von remove_submenu_page 50 Mal zu vermeiden. Dies funktioniert auch mit den Symbolleistenknoten:

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
quelle
15

Wahrscheinlich müssen Sie die Priorität add_action auf eine höhere Zahl setzen und diese beiden neuen Links gezielt so ausrichten :

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

Erweiterte benutzerdefinierte Felder bieten auch ein Hilfedokument dazu, wie Sie dies für ihr Menü tun können:

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

Das Kontaktformular 7 hat auch eine eigene Möglichkeit, die Sichtbarkeit des Menüs einzuschränken:

http://contactform7.com/einschränkung-des-zugangs-zum-administrationspanel/

Hereswhatidid
quelle
Das Ausblenden von contactform7 funktionierte für mich mitremove_menu_page( 'wpcf7' );
Abel Melquiades Callejo
8

Aktualisieren

Ich habe ein Code-Snippet mit einer stabileren Funktion erstellt, das sowohl Hauptmenüs als auch Untermenüelemente behandelt.

Ursprüngliche Antwort

Anstatt die Menüs anzugeben, die Sie entfernen möchten, geben Sie die Menüs an, die Sie beibehalten möchten :)

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

} 

Auf diese Weise müssen Sie nicht nach Plugin-Namen suchen und den Code ändern, wenn Sie neue Plugins hinzufügen.

numediaweb
quelle
Genau das, wonach ich gesucht habe! Auch Ihr Code-Snippet scheint großartig zu sein! Vielen Dank, dass Sie Ihre Lösung hinzugefügt haben. Bin dankbar!
Devner
5

Sie müssen den richtigen $ menu_slug finden. Der folgende Code hat bei mir funktioniert:

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

Natürlich können Sie nur die Elemente angeben, die Sie entfernen möchten. Schauen Sie sich den folgenden Code an:

/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]);
   }
}   

} 

Dies ist nur das Negative der Methode von numediaweb. Danke @numediaweb. Es funktioniert gut.

PS: 'menu_item_1 / n' -> Bewegen Sie den Mauszeiger über den Menüpunkt und rufen Sie die genaue Seite des im Link angezeigten Menüpunkts auf.

Prabhu Chelladurai
quelle
0

Verwenden Sie dieses Code-Snippet

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
quelle
Bitte bearbeiten Sie Ihre Antwort und fügen Sie eine Erklärung hinzu: Warum könnte dies das Problem lösen?
fuxia