จะลบหน้าเมนูผู้ดูแลระบบที่แทรกโดยปลั๊กอินได้อย่างไร


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

หากคุณจะใช้วิธีการแก้ปัญหาด้วยการเข้ารหัสปลั๊กอินเป็นผู้ช่วยในบริบทเช่นปลั๊กอิน 'จัดการ' รายการปลั๊กอินยังมีตัวบุ้งที่มีความจำเป็นต้องลบผ่านรหัสที่กำหนดเองหากการตั้งค่าของปลั๊กอินไม่ได้เป็นความต้องการของคุณ
bueltge

คำตอบ:


61

คุณต้องใช้hooksขวา(ซึ่งไม่เหมือนกับ URL / กระสุน) และไม่เจ็บที่จะใช้ hook ที่ทำงานในภายหลัง (เช่น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
        )

องค์ประกอบอาร์เรย์ที่มีคีย์คือสิ่งที่คุณกำลังมองหา:2wpcf7


5
การแสดงวิธีการทิ้งเมนูและค้นหาสิ่งที่จะใช้remove_menu_page()เป็นความช่วยเหลือที่ยิ่งใหญ่ - สอนให้ฉันรู้วิธีตกปลาแทนที่จะส่งปลาให้ฉัน!
Matthew Clark

สำหรับ acf มีวิธีที่ดีกว่าดูเอกสาร
hitautodestruct

รหัสการแก้ปัญหาคือความช่วยเหลือที่ดีมาก ขอบคุณที่แบ่งปันกัน!
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

คุณสามารถแก้ไขข้อบกพร่องทั้งหมดนี้ได้ด้วยการติดตามข้อมูลทั้งหมดที่คุณต้องการ:

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 globals (แม้ว่าจะไม่แนะนำก็ตาม)

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

และผูกมันทั้งหมดเข้าด้วยกันทำไมรหัสย่อของเราถึงสั้นลง? คุณสามารถใช้ ARRAYS เพื่อหลีกเลี่ยงการเขียน 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/


การซ่อน 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]);
    }   

} 

วิธีนี้คุณไม่ต้องค้นหาชื่อปลั๊กอินและแก้ไขรหัสเมื่อคุณเพิ่มปลั๊กอินใหม่ ..


สิ่งที่ฉันกำลังมองหา! นอกจากนี้ข้อมูลโค้ดของคุณดูเหมือนจะยอดเยี่ยม! ขอบคุณที่เพิ่มโซลูชันของคุณ ขอบคุณมัน!
Devner

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

โปรดแก้ไขคำตอบของคุณและเพิ่มคำอธิบาย: เหตุใดจึงแก้ไขปัญหาได้
fuxia
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.