Можно ли скрыть пользовательский интерфейс типа сообщения / меню от определенных ролей пользователя?

20

Что я хочу сделать, так это полностью скрыть пользовательский интерфейс для пользовательского типа записей от определенных пользовательских ролей ... Ранее я нашел много ресурсов о том, как отключить доступ к использованию этих CPT, но ничего, что действительно не позволяло бы полностью скрыть пользовательский интерфейс CPT. все вместе в зависимости от того, какой пользователь вошел в панель управления.

Это важно, поскольку мне нужно, чтобы клиенты полностью не использовали пользовательские типы записей для магазина, и если они все еще могут видеть пользовательский интерфейс CPT магазина на панели инструментов, то не имеет значения, ограничены ли их возможности, поскольку они все еще будут запрашивать как они могут самостоятельно добавлять продукт в результате.

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

Спасибо за вашу помощь, SB

Мистер Браун
источник

Ответы:

39

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

function wpse28782_remove_menu_items() {
    if( !current_user_can( 'administrator' ) ):
        remove_menu_page( 'edit.php?post_type=your_post_type' );
    endif;
}
add_action( 'admin_menu', 'wpse28782_remove_menu_items' );

your_post_type должно быть название вашего фактического типа сообщения.

РЕДАКТИРОВАТЬ-

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

remove_menu_page('edit.php'); // Posts
remove_menu_page('upload.php'); // Media
remove_menu_page('link-manager.php'); // Links
remove_menu_page('edit-comments.php'); // Comments
remove_menu_page('edit.php?post_type=page'); // Pages
remove_menu_page('plugins.php'); // Plugins
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

РЕДАКТИРОВАТЬ 2 -

Удаление пунктов меню плагина.

Для плагинов, кажется, вам нужен только page=запрос var. Другая вещь, на которую стоит обратить внимание, это приоритет, который является третьим аргументом для admin_menu add_action. Он должен быть достаточно низким (чем выше число, тем ниже приоритет), чтобы плагины уже добавили себя в меню.

function wpse28782_remove_plugin_admin_menu() {
    if( !current_user_can( 'administrator' ) ):
        remove_menu_page('cart66_admin');
    endif;
}
add_action( 'admin_menu', 'wpse28782_remove_plugin_admin_menu', 9999 );
Milo
источник
Такое простое решение, спасибо, оно сработало отлично!
Мистер Браун
Любопытно, является wpse28782_remove_menu_itemsли название функции, которое вы выбрали случайным образом, или это специфично для WP? .... Кроме того, как бы я расширил эту идею и нацелился на дополнительные CPT или, если уж на то пошло, другие родные меню WP? Спасибо еще раз за помощь!
Мистер Браун
1
@ Mr.Brown - имя функции основано на идентификаторе вашего вопроса (проверьте URL), просто что-то гарантированно уникальное, вы можете назвать его как угодно, если это не существующая функция. Вы также можете добавить дополнительные remove_menu_pageвызовы, чтобы удалить другие CPT, а также другие пункты меню, см. мое редактирование.
Майло
Так здорово, еще раз спасибо. Это удивительное решение.
Мистер Браун
Еще одна вещь - как мне найти имя шаблона, которое используется для дополнительных меню из плагинов, которые установлены в настоящее время? то есть. remove_menu_page('cart_plugin');
Мистер Браун
2

Принятый ответ можно использовать для скрытия пользовательских типов записей (и других различных элементов), как описано. Но если вы хотите скрыть само меню плагина CPT UI , вы также можете сначала удалить действие, которое добавляет его в меню.

if( !current_user_can( 'administrator' ) ) {
    remove_action( 'admin_menu', 'cptui_plugin_menu' );
}
Грант
источник
1

Вы также можете использовать плагин Adminimize . Этот плагин имеет опции для всех типов сообщений, мета-блоков и многое другое, чтобы скрыть на разных ролях. Нет кодирования.

bueltge
источник
0

Если вы хотите скрыть меню этого плагина, имя которого «Пользовательский пользовательский тип поста», то есть CPTUI, это невозможно при объединении первой ссылки с remove_menu_page.

Все, что вам нужно сделать, это;

function wpse_28782_remove_menus() {
    remove_menu_page('cptui_main_menu');
}
add_action('admin_init', 'wpse_28782_remove_menus');
merkdev
источник
0

Чтобы скрыть подменю Woocommerce в меню верхнего уровня «Продукты» для всех пользовательских ролей Shop Manager (Wordpress 5.1.1):

function remove_menus_shopmgr(){

// If the current user is a shop manager
if ( current_user_can('shop_manager') ) {

   //removes Products > Categories submenu 
    remove_submenu_page( 'edit.php?post_type=product','edit-tags.php?taxonomy=product_cat&post_type=product' );

   //removes Products > Tags submenu
    remove_submenu_page( 'edit.php?post_type=product','edit-tags.php?taxonomy=product_tag&post_type=product' ); 

    }
}

add_action( 'admin_menu', 'remove_menus_shopmgr', 999 );
Линда Стерлинг Графический дизайн
источник
0

Если у вас remove_menu_pageэто не работает (у меня не работает), то вместо удаления меню, альтернатива - сказать WordPress не показывать меню для типа записи:

function wpse28782_hide_menu_items() {
    if( !current_user_can( 'administrator' ) ) {
        $post_type = get_post_type_object( 'your_post_type');
        if ($post_type) {
            $post_type->show_in_menu = false;
        }
    }
}
add_action( 'admin_menu', 'wpse28782_hide_menu_items', 99 );
Брайан Крайер
источник