Как удалить страницы меню администратора, вставленные плагинами?

39

У меня есть следующий код, который очищает много вещей, которые не будут использоваться в области администратора:

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

};

Однако есть два пункта меню, которые были вставлены из плагинов.

Когда я наводю курсор мыши на каждый пункт меню, он говорит, что ссылки:

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

Есть ли способ скрыть эти страницы меню тоже?

tmyie
источник
Может быть глупо спрашивать, но зачем взламывать меню администратора, если вы можете деактивировать плагины?
eyoung100
5
@ eyoung100 Есть несколько причин. Наиболее очевидным было бы скрыть определенные функции от конкретных пользователей (ролей). Также может потребоваться реструктуризация меню администратора, и, следовательно, необходимо удалить (и снова добавить) определенные пункты меню.
tfrommen
Если вы хотите использовать решение с помощью кодирования, плагин является вспомогательным в контексте, например, плагин «Администрирование». Список плагинов также содержит список слагов, которые необходимо удалить с помощью пользовательского кода, если настройки плагина не являются вашими требованиями.
Бюльдж

Ответы:

61

Вам нужно использовать правильные хуки (которые не всегда совпадают с URL-адресами / слагами), и не повредит использовать хук, который запускается позже (например, 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' );
}

Вы можете использовать следующее для отладки:

add_action( 'admin_init', 'wpse_136058_debug_admin_menu' );

function wpse_136058_debug_admin_menu() {

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

Это дает (для моей настройки) следующее для страницы меню плагина 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
        )

Элемент массива с ключом 2является то , что вы ищете: wpcf7.

tfrommen
источник
5
Показывать, как бросать меню и находить, что использовать, remove_menu_page()было огромной помощью - научил меня ловить рыбу, а не просто вручать мне рыбу!
Мэтью Кларк
Для ACF есть лучший подход см. Документы
hitautodestruct
Код отладки очень помогает. Спасибо огромное за обмен!
Девнер
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

ВЫ МОЖЕТЕ ОТЛАДИТЬ ВСЕ ЭТО С ПОТОМ, ЧТОБЫ ПОЛУЧИТЬ ВСЕ ИНФОРМАЦИЮ, ВАМ НУЖНУЮ:

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;

Ключи предоставят вам значения массива, которые позволяют вам делать все это с глобалами WordPress (хотя и не рекомендуется)

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

А для удаления для определенных пользователей просто сделайте то же самое, кроме как с добавленными возможностями:

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

И СВЯЗАТЬ ВСЕ ВМЕСТЕ, ПОЧЕМУ НЕ КОРОТКО НАШ КОД? ВЫ МОЖЕТЕ ИСПОЛЬЗОВАТЬ Массивы, ЧТОБЫ ИЗБЕЖАТЬ ПИСЬМЕНА remove_submenu_page 50 раз. Это также работает с узлами панели инструментов:

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
Брайан Уиллис
источник
15

Возможно, вам нужно установить приоритет add_action на большее число и настроить таргетинг на эти две новые ссылки, например, так:

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

Расширенные пользовательские поля также предоставляют справочный документ о том, как сделать это для своего меню здесь:

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

Контактная форма 7 также имеет свой собственный способ ограничения видимости меню:

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

hereswhatidid
источник
скрытие contactform7 работал для меня с помощьюremove_menu_page( 'wpcf7' );
Абель Melquiades Callejo
8

Обновить

Я создал фрагмент кода с более надежной функцией, которая работает как с основными меню, так и с элементами подменю.

Оригинальный ответ

Вместо указания меню, которое вы хотите удалить, укажите меню, которые вы хотите сохранить :)

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

} 

Таким образом, вам не нужно искать имена плагинов и изменять код при добавлении новых плагинов.

numediaweb
источник
Именно то, что я искал! Кроме того, ваш фрагмент кода кажется отличным! Спасибо большое за добавление вашего решения. Ценить это!
Девнер
5

Вам нужно найти правильный $ menu_slug. Следующий код работал для меня:

add_action( 'admin_init', 'remove_menus' );
function remove_menus(){
  remove_menu_page( 'wpcf7' );
}
Винсент Вонг
источник
4

Конечно, вы можете указать только те элементы, которые хотите удалить. Посмотрите на код ниже:

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

} 

Это просто негатив метода numediaweb. Спасибо @numediaweb. Работает нормально.

PS: 'menu_item_1 / n' -> наведите курсор мыши на элемент меню и получите точную страницу этого элемента меню, показанную в ссылке.

Прабху Челладурай
источник
0

используйте этот фрагмент кода

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
источник
Пожалуйста, измените свой ответ и добавьте объяснение: почему это может решить проблему?
fuxia