Create a new role that only contains one plugin

47 Views Asked by At

I would like to create a new user role for the WordPress backend of a multisite. I already managed to create a user role for a single page. Everything worked. My goal is that only one plugin menu is shown in the user role.

My current status on the single page:

enter image description here

And my code for the user role:

function igv_user_role() {
    add_role(
        'custom_role',
        'EXAMPLE ROLE',
        array(
            'read'    => true,
            'level_0' => true,
            'newCap' => true,
        )
    );

    $role = get_role( 'custom_role' );
    $role->add_cap( 'newCap', false );

}

add_action( 'init', 'igv_user_role' );


//Adming Menue

function igv_add_menu() {
    add_menu_page( 'IGV', 'IGV', 'igv_gutscheinverwaltung', 'igv-menu', 'igv_dashboard', '', 99 );
    add_submenu_page( 'igv-menu', 'Import', 'Import', 'myCap'//<--Here, 'import', 'igv_import' );
    add_submenu_page( 'igv-menu', 'Ausgeben', 'Ausgeben', 'myCap'//<--Here, 'ausgeben', 'igv_ausgeben' );
    add_submenu_page( 'igv-menu', 'Entwerten', 'Entwerten', 'myCap'//<--Here, 'entwerten', 'igv_entwerten' );
    add_submenu_page( 'igv-menu', 'Alle Gutscheincodes', 'Alle Gutscheincodes', 'myCap'//<--Here, 'all_gutscheincodes', 'igv_all_gutscheincodes' );
    add_submenu_page( 'igv-menu', 'Händlerverwaltung', 'Händlerverwaltung', 'myCap'//<--Here, 'haendlerverwaltung', 'igv_haendlerverwaltung' );
    add_submenu_page( 'igv-menu', 'Händlersuche', 'Händlersuche', 'myCap'//<--Here, 'haendlersuche', 'igv_haendlersuche' );
};

add_action( 'admin_menu', 'igv_add_menu' );

The problem is that the user role shows the plugin even if you are logged in as admin or any other role. Why?

Maybe you have any ideas or I'm just looking wrong?

Thanks in advance

1

There are 1 best solutions below

0
On

If you want to hide the menu for everyone without this role (the add_menu_page or add_submenu_page don't provide this based on roles), you can just prevent it from being added for anyone else. Modify the igv_add_menu() function like so:


function igv_add_menu() {
  $role_name = 'custom_role';
  $user = wp_get_current_user();
  if ( in_array( $role_name, (array) $user->roles ) ) {
    add_menu_page( 'IGV', 'IGV', 'igv_gutscheinverwaltung', 'igv-menu', 'igv_dashboard', '', 99 );
    add_submenu_page( 'igv-menu', 'Import', 'Import', 'myCap', 'import', 'igv_import' );
    add_submenu_page( 'igv-menu', 'Ausgeben', 'Ausgeben', 'myCap', 'ausgeben', 'igv_ausgeben' );
    add_submenu_page( 'igv-menu', 'Entwerten', 'Entwerten', 'myCap', 'entwerten', 'igv_entwerten' );
    add_submenu_page( 'igv-menu', 'Alle Gutscheincodes', 'Alle Gutscheincodes', 'myCap', 'all_gutscheincodes', 'igv_all_gutscheincodes' );
    add_submenu_page( 'igv-menu', 'Händlerverwaltung', 'Händlerverwaltung', 'myCap', 'haendlerverwaltung', 'igv_haendlerverwaltung' );
    add_submenu_page( 'igv-menu', 'Händlersuche', 'Händlersuche', 'myCap', 'haendlersuche', 'igv_haendlersuche' );    
  }
};

Change the $role_name to whatever your role is named.