¿Cómo eliminar las páginas del menú de administración insertadas por complementos?

39

Tengo el siguiente código, que limpia muchas cosas que no se utilizarán en el área de administración:

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

};

Sin embargo, hay dos elementos de menú que se han insertado desde complementos.

Cuando paso el mouse sobre cada elemento del menú, dice que los enlaces son:

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

¿Hay alguna manera de ocultar estas páginas del menú también?

tmyie
fuente
Puede ser estúpido preguntar, pero ¿por qué hackear el menú de administración, cuando podría desactivar los complementos en cuestión?
eyoung100
55
@ eyoung100 Hay varias razones. La más aparente sería ocultar cierta funcionalidad de usuarios específicos (roles). También es posible que desee reestructurar el menú de administración y, por lo tanto, necesite eliminar (y volver a agregar) ciertas entradas de menú.
tfrommen
Si usaría una solución a través de la codificación, un complemento es una ayuda en contexto, como el complemento 'Administrar'. La lista de complementos también contiene las babosas que es necesario eliminar mediante un código personalizado si la configuración del complemento no es su requisito.
bueltge

Respuestas:

61

Debe usar los ganchos correctos (que no siempre son los mismos que los URL / slugs), y no está de más usar un gancho que se ejecute más tarde (por ejemplo, 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' );
}

Puede usar lo siguiente para depurar:

add_action( 'admin_init', 'wpse_136058_debug_admin_menu' );

function wpse_136058_debug_admin_menu() {

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

Esto proporciona (para mi configuración) lo siguiente para la página del menú del complemento 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
        )

El elemento de la matriz con la clave 2es lo que busca: wpcf7.

tfrommen
fuente
55
Mostrar cómo volcar el menú y encontrar para qué sirve remove_menu_page()fue de gran ayuda: ¡me enseñó a pescar en lugar de simplemente entregarme el pescado!
Matthew Clark
Para acf hay un mejor enfoque, ver los documentos
hitautodestruct
El código de depuración es de gran ayuda. ¡Muchas gracias por compartir!
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

Puede depurar todo esto con lo siguiente para obtener toda la información que necesita:

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;

Las teclas le darán los valores de la matriz que le permiten hacer todo esto con los globales de WordPress (aunque no se recomienda)

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

Y para eliminar para ciertos usuarios simplemente haga lo mismo, excepto con las capacidades agregadas:

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

Y PARA ATENTARLO TODO JUNTO ¿POR QUÉ NO ACORTAR NUESTRO CÓDIGO? PUEDE UTILIZAR ARRAYS PARA EVITAR LA ESCRITURA remove_submenu_page 50 veces. Esto también funciona con los nodos de la barra de herramientas:

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

Probablemente necesite establecer la prioridad add_action a un número mayor y orientar esos dos nuevos enlaces específicamente de esta manera:

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

Campos personalizados avanzados también proporciona un documento de ayuda sobre cómo hacer esto para su menú aquí:

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

Contact Form 7 también tiene su propia forma de restringir la visibilidad del menú:

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

hereswhatidid
fuente
ocultar contactform7 funcionó para mí usandoremove_menu_page( 'wpcf7' );
Abel Melquiades Callejo
8

Actualizar

Yo creé un fragmento de código con una función más robusta que se ocupa de los dos menús principales y elementos del submenú.

Respuesta original

En lugar de especificar los menús que desea eliminar, especifique los menús que desea mantener :)

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 esta manera, no tiene que buscar nombres de complementos y modificar el código cuando agrega nuevos complementos.

numediaweb
fuente
¡Exactamente lo que estaba buscando! ¡También su fragmento de código parece genial! Muchas gracias por agregar su solución. ¡Lo aprecio!
Devner
5

Necesita encontrar el $ menu_slug correcto. El siguiente código funcionó para mí:

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

Por supuesto, puede especificar solo los elementos que desea eliminar. Echa un vistazo al siguiente código:

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

} 

Esto es solo lo negativo del método de numediaweb. Gracias @numediaweb. Funciona bien.

PD: 'menu_item_1 / n' -> coloca el mouse sobre el elemento del menú y busca la página exacta de ese elemento del menú que se muestra en el enlace.

Prabhu Chelladurai
fuente
0

usa este fragmento de código

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
fuente
Por favor, editar su respuesta , y añadir una explicación: ¿por qué podría que resolver el problema?
fuxia