Вопрос или проблема
Я изменил порядок элементов меню администратора с помощью:
function custom_menu_order($menu_ord) {
if (!$menu_ord) return true;
return array(
'index.php', // Главная панель
'edit.php?post_type=page', // Страницы
'edit.php?post_type=sp_faq', // Часто задаваемые вопросы
'gf_edit_forms', // Формы
'woocommerce', // Woocommerce
'edit.php?post_type=product', // Продукты
'edit.php', // Записи/Новости
'edit.php?post_type=event', // События
'upload.php', // Мультимедиа
'themes.php', // Внешний вид
'plugins.php', // Плагины
'users.php', // Пользователи
'tools.php', // Инструменты
'options-general.php', // Настройки
);
}
add_filter('custom_menu_order', 'custom_menu_order'); // Активация custom_menu_order
add_filter('menu_order', 'custom_menu_order');
Это отлично работает для роли администратора, однако не работает для других ролей. Как я могу расширить этот пользовательский порядок меню для всех ролей пользователей?
Вы не уточняете, пытаетесь ли сделать все эти элементы доступными для всех ролей пользователей (что означало бы необходимость добавления пользовательских возможностей) – поэтому я предполагаю, что вы хотите только возможность настраивать порядок меню по пользователям.
Мой подход заключался в том, чтобы получить все роли, доступные текущему вошедшему в систему пользователю, а затем для каждой роли выполнить switch, чтобы получить соответствующий порядок.
function my_custom_menu_order( $menu_ord) {
$curr_id = get_current_user_id();
$user = new WP_User( $curr_id );
if ( !empty( $user->roles ) && is_array( $user->roles ) ) {
foreach ( $user->roles as $role ){
switch($role){
case 'administrator':
if (!$menu_ord) return true;
return array(
'options-general.php', // Настройки
'index.php', // Главная панель
'edit.php?post_type=page', // Страницы
'edit.php?post_type=faq', // Часто задаваемые вопросы
'options-general.php', // Настройки
'gf_edit_forms', // Формы
'woocommerce', // Woocommerce
'edit.php?post_type=product', // Продукты
'edit.php', // Записи/Новости
'edit.php?post_type=event', // События
'upload.php', // Мультимедиа
'themes.php', // Внешний вид
'plugins.php', // Плагины
'users.php', // Пользователи
'tools.php', // Инструменты
);
break;
case 'editor':
if (!$menu_ord) return true;
return array(
'edit.php?post_type=event', // События
'index.php', // Главная панель
'edit.php?post_type=page', // Страницы
'edit.php?post_type=faq', // Часто задаваемые вопросы
'options-general.php', // Настройки
'gf_edit_forms', // Формы
'woocommerce', // Woocommerce
'edit.php?post_type=product', // Продукты
'edit.php', // Записи/Новости
'upload.php', // Мультимедиа
'themes.php', // Внешний вид
'plugins.php', // Плагины
'users.php', // Пользователи
'options-general.php', // Настройки
'tools.php', // Инструменты
);
break;
default:
break;
}
}
}
add_filter('custom_menu_order', 'my_custom_menu_order');
add_filter('menu_order', 'my_custom_menu_order');
Ответ или решение
Чтобы задать порядок меню администратора для всех ролей пользователей в WordPress, вам необходимо модифицировать вашу функцию так, чтобы она учитывала каждую из ролей и задавала необходимый порядок в зависимости от роли пользователя. Ниже приведен пример кода, который решает данную задачу:
function custom_menu_order($menu_ord) {
if (!$menu_ord) return true; // Если заказ меню не установлен, вернем true для продолжения
// Получаем текущего пользователя
$curr_id = get_current_user_id();
$user = new WP_User($curr_id);
// Если у пользователя есть роли и каждая из этих ролей является массивом
if (!empty($user->roles) && is_array($user->roles)) {
foreach ($user->roles as $role) {
switch ($role) {
case 'administrator':
return array(
'index.php', // Панель управления
'edit.php?post_type=page', // Страницы
'edit.php?post_type=sp_faq', // Часто задаваемые вопросы
'gf_edit_forms', // Формы
'woocommerce', // Woocommerce
'edit.php?post_type=product', // Продукты
'edit.php', // Записи/Новости
'edit.php?post_type=event', // События
'upload.php', // Медиа
'themes.php', // Внешний вид
'plugins.php', // Плагины
'users.php', // Пользователи
'tools.php', // Инструменты
'options-general.php', // Настройки
);
break;
case 'editor':
return array(
'index.php', // Панель управления
'edit.php?post_type=page', // Страницы
'edit.php?post_type=event', // События
'edit.php', // Записи/Новости
'upload.php', // Медиа
// Другие элементы, доступные редакторам
);
break;
case 'author':
return array(
'index.php', // Панель управления
'edit.php', // Записи/Новости
'upload.php', // Медиа
// Другие элементы, доступные авторам
);
break;
case 'contributor':
return array(
'index.php', // Панель управления
'edit.php', // Записи/Новости
// Другие элементы, доступные контрибьюторам
);
break;
case 'subscriber':
return array(
'index.php', // Панель управления
// Минимальный набор для подписчиков
);
break;
default:
break;
}
}
}
return $menu_ord; // В случае, если роль не совпала, вернем стандартный порядок
}
// Применяем фильтры
add_filter('custom_menu_order', 'custom_menu_order');
add_filter('menu_order', 'custom_menu_order');
Пояснения к коду:
- Получение текущего пользователя: Используем функции
get_current_user_id()
иnew WP_User()
для определения ролей текущего пользователя. - Проверка ролей: Используем цикл foreach для проверки ролей и возвращаем определенный порядок меню в зависимости от роли.
- Стандартный порядок меню: Если ни одна роль не совпадает, возвращаем стандартный порядок меню.
Важно помнить:
- Если вы планируете сделать доступными все элементы меню для определенных ролей, вам также может потребоваться добавить соответствующие возможности (capabilities) к этим ролям.
- Убедитесь, что данный код добавляется в файл
functions.php
вашей темы или в специальный плагин для функционала.
Таким образом, данный вопрос о переупорядочивании элементов меню в админ-панели WordPress для всех ролей решен.