разрешить редакторам редактировать меню?
Я хотел бы предоставить своим редакторам возможность изменять меню, можно ли это сделать?
Вкладка внешний вид, похоже, вообще не является опцией, могу ли я сделать это так?
7 answers
Добавьте это в свою тему functions.php
:
// add editor the privilege to edit theme
// get the the role object
$role_object = get_role( 'editor' );
// add $cap capability to this role object
$role_object->add_cap( 'edit_theme_options' );
Обновление (предложено в комментариях):
Вероятно, вам не следует делать это при каждом запросе, AFAIK это вызывает запись в бд. Лучше на
admin_init
и только если!$role_object->has_cap('edit_theme_options')
РЕДАКТИРОВАТЬ: обновление для WP 4.9 и скрытие только пунктов меню для редактора
Если вы хотите, чтобы ваши пользователи могли изменять меню навигации, но не другие параметры в разделе внешний вид: используйте это
// Do this only once. Can go anywhere inside your functions.php file
$role_object = get_role( 'editor' );
$role_object->add_cap( 'edit_theme_options' );
Вы можете закомментировать весь этот код после обновления панели администратора, потому что приведенный выше код будет вносить постоянные изменения в базу данных.
Теперь у вас есть все параметры в разделе внешний вид, видимые редакторам. Вы можете скрыть другие параметры, такие как итак:
function hide_menu() {
if (current_user_can('editor')) {
remove_submenu_page( 'themes.php', 'themes.php' ); // hide the theme selection submenu
remove_submenu_page( 'themes.php', 'widgets.php' ); // hide the widgets submenu
remove_submenu_page( 'themes.php', 'customize.php?return=%2Fwp-admin%2Ftools.php' ); // hide the customizer submenu
remove_submenu_page( 'themes.php', 'customize.php?return=%2Fwp-admin%2Ftools.php&autofocus%5Bcontrol%5D=background_image' ); // hide the background submenu
// these are theme-specific. Can have other names or simply not exist in your current theme.
remove_submenu_page( 'themes.php', 'yiw_panel' );
remove_submenu_page( 'themes.php', 'custom-header' );
remove_submenu_page( 'themes.php', 'custom-background' );
}
}
add_action('admin_head', 'hide_menu');
Последние 3 строки в функции hide_menu()
являются тематическими для моей темы. Вы можете найти второй параметр, нажав на подменю, которое вы хотите скрыть, в панели администратора. Ваш URL-адрес будет выглядеть примерно так: example.com/wp-admin/themes.php?page=yiw_панель
Таким образом, в этом примере вторым параметром для функции remove_submenu_page()
будет yiw_panel
В WordPress 3.8 этот код был бы лучше, чем текущий принятый ответ.
/**
* @var $roleObject WP_Role
*/
$roleObject = get_role( 'editor' );
if (!$roleObject->has_cap( 'edit_theme_options' ) ) {
$roleObject->add_cap( 'edit_theme_options' );
}
Когда я смотрю на структуру меню администратора, кажется, что ссылка nav-menus.php
привязана к возможности edit_theme_options
. Можете ли вы изменить роль редактора, чтобы включить эту возможность? Это также дало бы им возможность редактировать виджеты, я не знаю, является ли это проблемой? Все элементы Ajax меню ограничены этой возможностью, поэтому простое изменение возможности меню администратора для редактирования меню, вероятно, не сработает.
Установите плагин "Редактор ролей пользователя" - Включите опции edit_theme_options - установите плагин Adminimize - отключите "Виджеты" и "Переключите тему" для редакторов;)
Сейчас 2020 год, WordPress вышел из версии 5.3, поэтому я подумал, что внесу обновленную версию, в которой настройки сохраняются в базе данных только один раз - при активации темы и удаляются, когда тема деактивирована.
function add_theme_caps(){
global $pagenow;
// gets the author role
$role = get_role('editor');
if ('themes.php' == $pagenow && isset($_GET['activated'])) {
// Test if theme is activated
// Theme is activated
// This only works, because it accesses the class instance.
// would allow the editor to edit the theme options
$role->add_cap('edit_theme_options');
} else {
// Theme is deactivated
// Remove the capability when theme is deactivated
$role->remove_cap('edit_theme_options');
}
}
add_action( 'load-themes.php', 'add_theme_caps' );
Я также предпочитаю кодировать в стиле ООП, так что это версия ООП:
/**
* YourClient Class
*
* @author John Doe
* @package YourClient
* @since 1.0
*/
if (!defined('ABSPATH')) {
exit;
}
if (!class_exists('YourClient')) {
/**
* The main YourClient class
*/
class YourClient
{
/**
* Setup class
*/
public function __construct()
{
// Give more privileges on Theme Activation
add_action('load-themes.php', array($this, 'add_theme_caps'));
}
function add_theme_caps()
{
global $pagenow;
// gets the author role
$role = get_role('editor');
if ('themes.php' == $pagenow && isset($_GET['activated'])) { // Test if theme is activated
// Theme is activated
// This only works, because it accesses the class instance.
// would allow the author to edit others' posts for current theme only
$role->add_cap('edit_theme_options');
} else {
// Theme is deactivated
// Remove the capability when theme is deactivated
$role->remove_cap('edit_theme_options');
}
}
}
}
Я обнаружил, что ваше меню будет работать следующим образом: установите плагин " Редактор ролей пользователя", и там вы можете редактировать условия для роли редактора и другие. Включите опцию edit_theme_options. Но теперь: вы увидите "меню" - опцию в разделе "темы", "виджеты". Для меня: После нажатия кнопки "меню" (в качестве редактора) Я не вижу заполненных опций, но пустых. Таким образом, идентификатор деактивирует плагин "Редактор ролей пользователя", и заполненные параметры для "меню" отображаются правильно. Обратите внимание, что деактивация плагина "Редактор ролей пользователя" остается условия для активного редактора! Хорошо для меня, может быть, это поможет и тебе