Вопрос или проблема
Я хочу полностью скрыть интерфейс пользовательского типа постов от определенных ролей пользователей… Ранее я нашел много ресурсов о том, как отключить доступ к использованию этих 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=
. Также стоит отметить приоритет, который является третьим аргументом в 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 );
Принятый ответ можно использовать для скрытия пользовательских типов постов (и других различных элементов), как описано. Но если вы хотите скрыть само меню плагина 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');
Чтобы скрыть подменю 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 );
Если вы хотите отключить конкретное меню для конкретной роли пользователя, используйте это-
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 );
Ответ или решение
Скрытие пользовательского интерфейса для пользовательского типа записи в WordPress на основе ролей пользователей
Ваша задача заключается в том, чтобы полностью скрыть пользовательский интерфейс для пользовательского типа записи (Custom Post Type, CPT) от определённых пользовательских ролей в панели управления WordPress. Это особенно важно для изоляции клиентов от функционала, не предназначенного для них, что предотвратит потенциальные ошибки и снижает риск неправильного использования системы.
Основное решение: использование функции remove_menu_page
Одним из простых и эффективных решений является использование функции remove_menu_page()
в WordPress. Она позволяет скрыть определённые элементы меню в админ-панели в зависимости от прав пользователя. Пример кода, который можно использовать для этого, выглядит следующим образом:
function hide_custom_post_type_menu() {
if ( !current_user_can( 'administrator' ) ) { // Проверка на роль администратора
remove_menu_page( 'edit.php?post_type=your_post_type' ); // Замените 'your_post_type' на ваш пользовательский тип записи
}
}
add_action( 'admin_menu', 'hide_custom_post_type_menu' );
В приведённом выше коде remove_menu_page()
удаляет меню для указанного пользовательского типа записи только для пользователей, которые не имеют прав администратора.
Скрытие подменю для конкретных ролей
Если вам требуется скрыть не только основной пункт меню, но и подменю, связанное с этим пользовательским типом, вы можете использовать аналогичный подход. Например, чтобы скрыть разделы, связанные с продуктами в WooCommerce для ролей, таких как «Shop Manager», можно написать следующую функцию:
function remove_woocommerce_submenus() {
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_woocommerce_submenus', 999 );
Скрытие меню для специфических ролей
Если требуется более универсальное решение для разных ролей, вы можете использовать следующий подход, в котором проверяются роли пользователя и удаляются ненужные элементы меню:
function remove_menus_for_specific_roles() {
$current_user = wp_get_current_user();
// Определение массивов меню для удаления
$menus_to_remove = [
'edit.php?post_type=your_post_type', // Ваш пользовательский тип записи
'edit.php', // Записи
'upload.php', // Медиа
];
// Проверка на определённую роль
if ( in_array( 'user_role_slug', $current_user->roles, true ) ) { // Замените 'user_role_slug' на нужную роль
foreach ( $menus_to_remove as $menu_slug ) {
remove_menu_page( $menu_slug );
}
}
}
add_action( 'admin_menu', 'remove_menus_for_specific_roles', 99 );
Дополнительные опции
Если вы ищете решение без написания кода, можно рассмотреть использование плагина, например, Adminimize. Этот плагин предоставляет интерфейс, позволяющий управлять видимостью элементов меню и метаполей в панели управления для разных ролей пользователей, не требуя программирования.
Итого
Скрытие пользовательского интерфейса для пользовательских типов записей в WordPress может быть выполнено через предусмотренные функции, такие как remove_menu_page()
, предлагая гибкость в управлении видимостью элементов меню на основе ролей пользователей. Использование этих методов позволит вам создать более безопасную и управляемую среду для пользователей WordPress, минимизируя путаницу и возможные ошибки со стороны клиентов.