Возможно ли скрыть интерфейс/меню Custom Post Type для определенных ролей пользователей?
Я хочу полностью скрыть пользовательский интерфейс для определенного типа записей от конкретных ролей пользователей... Ранее я находил много ресурсов о том, как отключить доступ к использованию этих CPT, но ничего, что позволяло бы полностью скрыть интерфейс CPT в зависимости от того, какой пользователь вошел в панель управления.
Это важно, поскольку мне нужно, чтобы клиенты полностью держались подальше от пользовательских типов записей для магазина, и если они все еще могут видеть интерфейс CPT магазина в панели управления, то не имеет значения, что их возможности ограничены, поскольку они все равно будут интересоваться, как они могут самостоятельно добавлять товары.
Я бы предпочел не использовать для этого плагин, однако если есть что-то, что может сделать это без лишней нагрузки на систему, это тоже было бы отлично.
Спасибо за помощь, SB
Как скрыть пункт меню типа записи для пользователей без прав администратора:
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 );

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

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

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

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

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

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

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

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

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

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

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

Принятый ответ может быть использован для скрытия пользовательских типов записей (и других элементов), как описано. Но если вы хотите скрыть само меню плагина CPT UI, вы также можете удалить действие, которое добавляет его в меню.
if( !current_user_can( 'administrator' ) {
remove_action( 'admin_menu', 'cptui_plugin_menu' );
}

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

Если вы хотите скрыть меню плагина под названием "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');

Если вам нужно отключить определенные пункты меню для конкретной роли пользователя, используйте этот код:
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 );

Чтобы скрыть подменю 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&post_type=product' );
//удаляет подменю Товары > Метки
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 );

Если функция 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 );
