Возможно ли скрыть интерфейс/меню Custom Post Type для определенных ролей пользователей?

17 сент. 2011 г., 21:51:53
Просмотры: 55.9K
Голосов: 25

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

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

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

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

0
Все ответы на вопрос 7
14
50

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

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'); // Записи
remove_menu_page('upload.php'); // Медиафайлы
remove_menu_page('link-manager.php'); // Ссылки
remove_menu_page('edit-comments.php'); // Комментарии
remove_menu_page('edit.php?post_type=page'); // Страницы
remove_menu_page('plugins.php'); // Плагины
remove_menu_page('themes.php'); // Внешний вид
remove_menu_page('users.php'); // Пользователи
remove_menu_page('tools.php'); // Инструменты
remove_menu_page('options-general.php'); // Настройки

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

Скрытие пунктов меню плагинов.

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

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 );
17 сент. 2011 г. 22:14:36
Комментарии

Такое простое решение, спасибо, оно отлично сработало!

Mr.Brown Mr.Brown
17 сент. 2011 г. 22:28:11

Интересно, wpse28782_remove_menu_items - это случайно выбранное имя функции или оно специфично для WP?.. И еще, как можно расширить эту идею и добавить другие CPT или нативные меню WP? Еще раз спасибо за помощь!

Mr.Brown Mr.Brown
17 сент. 2011 г. 22:32:36

@Mr.Brown - имя функции основано на id вашего вопроса (проверьте url), просто что-то гарантированно уникальное, вы можете назвать ее как угодно, главное чтобы это не было именем уже существующей функции. Вы также можете добавить дополнительные вызовы remove_menu_page для удаления других CPT или элементов меню, см. мое редактирование.

Milo Milo
17 сент. 2011 г. 23:05:01

Очень круто, ещё раз спасибо. Это потрясающее решение.

Mr.Brown Mr.Brown
17 сент. 2011 г. 23:06:51

Последний вопрос - как мне найти название шаблона, который используется для дополнительных меню из установленных плагинов? Например, remove_menu_page('cart_plugin');

Mr.Brown Mr.Brown
17 сент. 2011 г. 23:11:23

Я пробовал навести курсор на пункт меню и использовать путь, который он показывает, но безрезультатно - меню всё равно отображается, хотя другие пункты меню точно соответствуют тому, что показано в вашем примере при наведении... Я использую плагин cart66, и вот какой путь был при наведении: remove_menu_page( 'admin.php?page=cart66_admin' ); - но это не сработало.

Mr.Brown Mr.Brown
17 сент. 2011 г. 23:23:03

@Mr.Brown - смотрите правку выше.

Milo Milo
18 сент. 2011 г. 02:12:08

Потрясающе, вы были очень полезны. Значит, всем плагинам нужна только последняя часть пути, а не page=, я правильно понимаю?

Mr.Brown Mr.Brown
18 сент. 2011 г. 05:42:58

@Mr.Brown - Я так считаю, по крайней мере, из тех немногих, что я посмотрел. В качестве теста, внутри вашей функции admin_menu вы можете добавить global $menu;, а затем print_r( $menu );, что покажет массив, из которого строится меню (просмотрите исходный код страницы или оберните его в тег <pre> для лучшей читаемости). Элемент с индексом 2 в каждом подмассиве меню - это то, что вы хотите использовать с remove_menu_page

Milo Milo
18 сент. 2011 г. 06:09:16

Мило - огромное спасибо, друг!...этот форум всегда потрясающий, но ты, сэр, действительно помог мне чему-то научиться, так что спасибо за твоё терпение и время, которое ты уделил, чтобы всё разжевать для такого новичка, как я! С наилучшими пожеланиями, SB.

Mr.Brown Mr.Brown
18 сент. 2011 г. 07:17:50

Обратите внимание, что это решение удаляет меню, но не предотвращает доступ пользователя к этим страницам по url.

MZAweb MZAweb
19 янв. 2014 г. 18:38:43

@MZAweb - верно, но если вы прочитали вопрос, то это не то, о чём спрашивали. Возможность доступа к страницам уже была реализована через права пользователей.

Milo Milo
19 янв. 2014 г. 18:45:52

Отличный ответ, сработало идеально... спасибо, что также показали, как скрывать элементы помимо CPT.

Simon Simon
19 янв. 2016 г. 17:40:39

А как насчёт удаления New > Post | Media | Page | CPT? Для этого нужен хук admin_bar_menu - https://wordpress.stackexchange.com/a/76647/84219

jgraup jgraup
19 сент. 2018 г. 23:25:40
Показать остальные 9 комментариев
0

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

if( !current_user_can( 'administrator' ) {
    remove_action( 'admin_menu', 'cptui_plugin_menu' );
}
15 окт. 2018 г. 16:21:23
0

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

11 янв. 2013 г. 21:29:12
0

Если вы хотите скрыть меню плагина под названием "Custom Post Type UI" (CPTUI), это невозможно сделать, просто объединив первую ссылку с remove_menu_page.

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

function wpse_28782_remove_menus() {
    remove_menu_page('cptui_main_menu');
}
add_action('admin_init', 'wpse_28782_remove_menus');
20 дек. 2018 г. 21:57:08
0

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

function wp2024_remove_unnecessary_menus() {
    $current_user = wp_get_current_user();

    // Определяем пункты меню для удаления
    $menus_to_remove = [
        'elementor',
        'themes.php',
        'plugins.php',
    ];

    if ( in_array( 'user_role_slug', $current_user->roles, true ) ) {
        foreach ( $menus_to_remove as $menu_slug ) {
            remove_menu_page( $menu_slug );
        }
    }
}
add_action( 'admin_menu', 'wp2024_remove_unnecessary_menus', 99 );
22 нояб. 2024 г. 10:21:37
0

Чтобы скрыть подменю WooCommerce под основным меню "Товары" для всех пользователей с ролью Shop Manager (WordPress 5.1.1):

function remove_menus_shopmgr(){

// Если текущий пользователь - менеджер магазина
if ( current_user_can('shop_manager') ) {

   //удаляет подменю Товары > Категории
    remove_submenu_page( 'edit.php?post_type=product','edit-tags.php?taxonomy=product_cat&amp;post_type=product' );

   //удаляет подменю Товары > Метки
    remove_submenu_page( 'edit.php?post_type=product','edit-tags.php?taxonomy=product_tag&amp;post_type=product' ); 

    }
}

add_action( 'admin_menu', 'remove_menus_shopmgr', 999 );
23 апр. 2019 г. 07:56:55
1

Если функция 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 );
11 сент. 2019 г. 11:52:45
Комментарии

Это, кажется, не работает для меня в мультисайтовой настройке.

Saqib Saqib
24 сент. 2024 г. 16:53:25