разрешить редакторам редактировать меню?
Я хотел бы предоставить моим редакторам возможность изменять меню, возможно ли это сделать?
Вкладка "Внешний вид" вообще не отображается в их панели, можно ли это как-то настроить?

Добавьте это в файл functions.php
вашей темы:
// добавляем редактору привилегию на редактирование темы
// получаем объект роли
$role_object = get_role( 'editor' );
// добавляем $cap возможность этому объекту роли
$role_object->add_cap( 'edit_theme_options' );
Обновление (предложено в комментариях):
Вероятно, не стоит выполнять это при каждом запросе, насколько я знаю, это вызывает запись в базу данных. Лучше использовать хук
admin_init
и только если!$role_object->has_cap('edit_theme_options')

@Mild Fuzz - сам по себе нет, но он возвращает экземпляр класса WP_Role

Вероятно, не стоит делать это при каждом запросе, так как, насколько я понял, это вызывает запись в БД. Лучше на хуке admin_init
и только if !$role_object->has_cap('edit_theme_options')

Эта настройка сохраняется в базе данных (в таблице wp_options, поле wp_user_roles), поэтому лучше выполнять этот код при активации темы/плагина. Смотрите https://codex.wordpress.org/Function_Reference/add_cap

РЕДАКТИРОВАНО: обновлено для WP 4.9 и скрытия элементов меню только для редакторов
Если вы хотите, чтобы пользователи могли изменять меню навигации, но не другие опции в разделе "Внешний вид", используйте это:
// Выполните это только один раз. Можно разместить в любом месте файла functions.php
$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' ); // скрыть подменю выбора темы
remove_submenu_page( 'themes.php', 'widgets.php' ); // скрыть подменю виджетов
remove_submenu_page( 'themes.php', 'customize.php?return=%2Fwp-admin%2Ftools.php' ); // скрыть подменю кастомизатора
remove_submenu_page( 'themes.php', 'customize.php?return=%2Fwp-admin%2Ftools.php&autofocus%5Bcontrol%5D=background_image' ); // скрыть подменю фона
// эти пункты специфичны для темы. Могут иметь другие названия или просто отсутствовать в вашей текущей теме.
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_panel
Таким образом, в этом примере вторым параметром для функции remove_submenu_page()
будет yiw_panel

Когда я смотрю на структуру меню админки, кажется, что ссылка на nav-menus.php
привязана к capability edit_theme_options
. Можешь изменить роль редактора, чтобы включить эту capability? Это также даст им возможность редактировать виджеты, не знаю, станет ли это проблемой? Все Ajax-действия с меню ограничены этой capability, поэтому простое изменение capability в админ-меню для редактирования меню, скорее всего, не сработает.

2020 год, WordPress уже вышел за версию 5.3, поэтому я решил внести обновлённую версию, в которой настройка сохраняется в базе данных только один раз — при активации темы, и удаляется при её деактивации.
function add_theme_caps(){
global $pagenow;
// получаем роль редактора
$role = get_role('editor');
if ('themes.php' == $pagenow && isset($_GET['activated'])) {
// Проверяем, активирована ли тема
// Тема активирована
// Это работает только потому, что обращается к экземпляру класса
// позволяет редактору изменять настройки темы
$role->add_cap('edit_theme_options');
} else {
// Тема деактивирована
// Удаляем возможность при деактивации темы
$role->remove_cap('edit_theme_options');
}
}
add_action( 'load-themes.php', 'add_theme_caps' );
Я также предпочитаю программировать в ООП-стиле, поэтому вот ООП-версия:
/**
* Класс YourClient
*
* @author John Doe
* @package YourClient
* @since 1.0
*/
if (!defined('ABSPATH')) {
exit;
}
if (!class_exists('YourClient')) {
/**
* Основной класс YourClient
*/
class YourClient
{
/**
* Настройка класса
*/
public function __construct()
{
// Даём больше привилегий при активации темы
add_action('load-themes.php', array($this, 'add_theme_caps'));
}
function add_theme_caps()
{
global $pagenow;
// получаем роль редактора
$role = get_role('editor');
if ('themes.php' == $pagenow && isset($_GET['activated'])) { // Проверяем, активирована ли тема
// Тема активирована
// Это работает только потому, что обращается к экземпляру класса.
// позволяет редактору изменять записи других пользователей только для текущей темы
$role->add_cap('edit_theme_options');
} else {
// Тема деактивирована
// Удаляем возможность при деактивации темы
$role->remove_cap('edit_theme_options');
}
}
}
}

Я обнаружил, что ваше меню будет работать следующим образом: установите плагин "User Role Editor" и там вы сможете редактировать условия для роли редактора и других. Включите опцию edit_theme_options. Но теперь: вы увидите пункт "меню" в разделе "темы", "виджеты".
В моем случае: после клика на "меню" (как редактор) я не видел заполненные опции, а только пустые. Поэтому я деактивировал плагин "User Role Editor", и заполненные опции для "меню" появились правильно. Важно отметить, что деактивация плагина "User Role Editor" сохраняет активными условия для редактора! Это сработало для меня, возможно, поможет и вам.
