Як видалити сторінки адміністратора, вставлені плагінами?


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

Чи є також спосіб приховати ці сторінки меню?


Може бути дурним запитати, але навіщо зламати меню адміністратора, коли ви могли деактивувати плагіни?
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>';
}

Це дає (для мого налаштування) наступне на сторінці меню плагінів Контактна форма 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.


5
Показати, як скинути меню і знайти, для чого використовувати, remove_menu_page()було величезною допомогою - навчив мене ловити рибу, а не просто вручати мені рибу!
Меттью Кларк

Для ACF є кращий підхід, дивіться документи
hitautodestruct

Код налагодження дуже допомагає. Дякую тонну за спільний доступ!
Девнер

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

ВИ МОЖЕТЕ ДЕГУВАТИ ВСІ ЦІ ЗАСЛІДКИ, ЩО ВИБУДЕТЕ ВСІ ІНФОРМАЦІЇ, ЩО Вам потрібно:

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

І ВЗАЄМО ВСЕ ВСЕ РОБОЧО, ЧОМУ НЕ КОРОТКАЙТЕ НАШ КОД? ВИ МОЖЕТЕ ВИКОРИСТУВАТИ ДРУГИ, щоб уникнути написання delete_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( '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/


приховуючи contactform7 працював на мене, використовуючиremove_menu_page( 'wpcf7' );
Abel 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]);
    }   

} 

Таким чином, вам не потрібно шукати імена плагінів і змінювати код, коли ви додаєте нові плагіни.


Саме те, що я шукав! Також ваш фрагмент коду здається чудовим! Дякую тонну за додавання вашого рішення. Оцініть це!
Девнер

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

Будь ласка , змініть свій відповідь , і додати пояснення: чому це може вирішити цю проблему?
фуксія
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.