permettere agli editor di modificare i menu?
Vorrei poter concedere ai miei editor la possibilità di modificare il menu, è possibile farlo?
La scheda Aspetto non sembra essere un'opzione disponibile, posso renderla accessibile?

aggiungi questo al file functions.php
del tuo tema:
// aggiunge all'editor il privilegio di modificare il tema
// ottiene l'oggetto del ruolo
$role_object = get_role( 'editor' );
// aggiunge la capability $cap a questo oggetto ruolo
$role_object->add_cap( 'edit_theme_options' );
Aggiornamento (suggerito nei commenti):
Probabilmente non dovresti eseguirlo ad ogni richiesta, AFAIK questo causa una scrittura sul database. Meglio su
admin_init
e solo se!$role_object->has_cap('edit_theme_options')

@Mild Fuzz - no di per sé no, ma restituisce un'istanza di WP_Role

Probabilmente non dovresti farlo ad ogni richiesta, poiché questo causa una scrittura sul database per quanto ho capito. Meglio su admin_init
e solo if !$role_object->has_cap('edit_theme_options')

Questa impostazione viene salvata nel database (nella tabella wp_options, campo wp_user_roles), quindi potrebbe essere meglio eseguirla durante l'attivazione del tema/plugin. Vedi https://codex.wordpress.org/Function_Reference/add_cap

EDIT: aggiornamento per WP 4.9 & nascondere solo le voci di menu per l'Editor
Se vuoi che i tuoi utenti possano modificare il menu di navigazione, ma non le altre opzioni sotto Aspetto: usa questo codice
// Esegui questo solo una volta. Può essere inserito ovunque nel tuo file functions.php
$role_object = get_role( 'editor' );
$role_object->add_cap( 'edit_theme_options' );
Puoi commentare l'intero codice dopo aver aggiornato il pannello di amministrazione, perché il codice sopra apporterà modifiche persistenti al database.
Ora tutte le opzioni sotto Aspetto saranno visibili agli editori. Puoi nascondere le altre opzioni in questo modo:
function hide_menu() {
if (current_user_can('editor')) {
remove_submenu_page( 'themes.php', 'themes.php' ); // nasconde il sottomenu di selezione del tema
remove_submenu_page( 'themes.php', 'widgets.php' ); // nasconde il sottomenu dei widget
remove_submenu_page( 'themes.php', 'customize.php?return=%2Fwp-admin%2Ftools.php' ); // nasconde il sottomenu del personalizzatore
remove_submenu_page( 'themes.php', 'customize.php?return=%2Fwp-admin%2Ftools.php&autofocus%5Bcontrol%5D=background_image' ); // nasconde il sottomenu dello sfondo
// queste sono specifiche del tema. Possono avere altri nomi o semplicemente non esistere nel tuo tema corrente.
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');
Le ultime 3 righe nella funzione hide_menu()
sono specifiche per il mio tema. Puoi trovare il secondo parametro cliccando sul sottomenu che vuoi nascondere, nel pannello di amministrazione. L'URL sarà qualcosa tipo: example.com/wp-admin/themes.php?page=yiw_panel
Quindi, in questo esempio, il secondo parametro per la funzione remove_submenu_page()
sarà yiw_panel

In WordPress 3.8, questo sarebbe un codice migliore rispetto alla risposta attualmente accettata.
/**
* @var $roleObject WP_Role
*/
$roleObject = get_role( 'editor' );
if (!$roleObject->has_cap( 'edit_theme_options' ) ) {
$roleObject->add_cap( 'edit_theme_options' );
}

Quando osservo la struttura del menu di amministrazione, sembra che il link nav-menus.php
sia collegato alla capability edit_theme_options
. Puoi modificare il ruolo dell'editor per includere questa capability? Questo gli darebbe anche la possibilità di modificare i widget, non so se questo sia un problema? Tutta la parte Ajax dei menu è limitata da questa capability, quindi cambiare solo la capability del menu di amministrazione per modificare i menu probabilmente non funzionerà.

È il 2020, WordPress ha superato la versione 5.3, quindi ho pensato di contribuire con una versione aggiornata in cui l'impostazione viene salvata solo una volta nel database - all'attivazione del tema, e rimossa quando il tema viene disattivato.
function add_theme_caps(){
global $pagenow;
// ottiene il ruolo dell'editor
$role = get_role('editor');
if ('themes.php' == $pagenow && isset($_GET['activated'])) {
// Verifica se il tema è attivato
// Tema attivato
// Funziona solo perché accede all'istanza della classe
// consente all'editor di modificare le opzioni del tema
$role->add_cap('edit_theme_options');
} else {
// Tema disattivato
// Rimuove la capacità quando il tema è disattivato
$role->remove_cap('edit_theme_options');
}
}
add_action( 'load-themes.php', 'add_theme_caps' );
Preferisco inoltre programmare in stile OOP, quindi questa è una versione OOP:
/**
* Classe YourClient
*
* @author John Doe
* @package YourClient
* @since 1.0
*/
if (!defined('ABSPATH')) {
exit;
}
if (!class_exists('YourClient')) {
/**
* La classe principale YourClient
*/
class YourClient
{
/**
* Configura la classe
*/
public function __construct()
{
// Concede più privilegi all'attivazione del Tema
add_action('load-themes.php', array($this, 'add_theme_caps'));
}
function add_theme_caps()
{
global $pagenow;
// ottiene il ruolo dell'editor
$role = get_role('editor');
if ('themes.php' == $pagenow && isset($_GET['activated'])) { // Verifica se il tema è attivato
// Tema attivato
// Funziona solo perché accede all'istanza della classe
// consente all'editor di modificare le opzioni del tema solo per il tema corrente
$role->add_cap('edit_theme_options');
} else {
// Tema disattivato
// Rimuove la capacità quando il tema è disattivato
$role->remove_cap('edit_theme_options');
}
}
}
}

Ho scoperto che il tuo menu funzionerà in questo modo: installa il plugin "User Role Editor" e lì puoi modificare le condizioni per il ruolo di editor e altri. Attiva l'opzione edit_theme_options. Ma ora: vedrai l'opzione "menu" sotto "temi", "widgets".
Nel mio caso: dopo aver cliccato su "menu" (come editor) non vedevo le opzioni riempite ma vuote. Quindi ho disattivato il plugin "User Role Editor" e le opzioni per "menu" sono apparse correttamente. Nota che disattivando il plugin "User Role Editor" le condizioni per l'editor rimangono attive! Per me è stato utile, forse può aiutare anche te.
