Come permettere all'editor di modificare solo la pagina delle impostazioni sulla privacy?
Nella mia installazione di WordPress (4.9.8.)
il ruolo di editor non ha i permessi per modificare la pagina sulla privacy.
Funzionerebbe aggiungendo questo al mio functions.php
:
$role_object = get_role( 'editor' );
$role_object->add_cap( 'manage_privacy_options', true );
$role_object->add_cap( 'manage_options' ); // questo deve essere attivo affinché il capability precedente funzioni
Ma così l'editor ottiene molti più permessi oltre alla semplice modifica della pagina sulla privacy.
Esiste un altro modo per concedere l'accesso al ruolo editor
con qualche riga di codice PHP?
Come soluzione alternativa sto usando questo plugin: https://wordpress.org/plugins/manage-privacy-options/
Un'altra soluzione temporanea è semplicemente non selezionare alcuna pagina privacy nelle impostazioni.

La modifica della pagina della privacy policy è limitata alle capacità manage_privacy_options
come indicato in un commento nel file core di WordPress wp-includes/capabilities.php
:
/*
* L'impostazione della pagina della privacy policy richiede `manage_privacy_options`,
* quindi anche la modifica dovrebbe richiederla.
*/
if ( (int) get_option( 'wp_page_for_privacy_policy' ) === $post->ID ) {
$caps = array_merge( $caps, map_meta_cap( 'manage_privacy_options', $user_id ) );
}
Per consentire agli utenti con i ruoli che possono modificare le pagine (sia in istanze singole che multisito) di modificare ed eliminare la pagina della privacy policy, è necessario sovrascrivere l'array editor
e administrator
$caps
:
add_filter('map_meta_cap', 'custom_manage_privacy_options', 1, 4);
function custom_manage_privacy_options($caps, $cap, $user_id, $args)
{
if (!is_user_logged_in()) return $caps;
if ('manage_privacy_options' === $cap) {
$manage_name = is_multisite() ? 'manage_network' : 'manage_options';
$caps = array_diff($caps, [ $manage_name ]);
}
return $caps;
}
Aggiornamento: Consenti agli utenti con il ruolo editor
o administrator
di modificare ed eliminare la pagina della privacy policy (cosa non possibile di default nelle istanze multisito):
add_filter('map_meta_cap', 'custom_manage_privacy_options', 1, 4);
function custom_manage_privacy_options($caps, $cap, $user_id, $args)
{
if (!is_user_logged_in()) return $caps;
$user_meta = get_userdata($user_id);
if (array_intersect(['editor', 'administrator'], $user_meta->roles)) {
if ('manage_privacy_options' === $cap) {
$manage_name = is_multisite() ? 'manage_network' : 'manage_options';
$caps = array_diff($caps, [ $manage_name ]);
}
}
return $caps;
}

oh sembra molto intelligente.. 1. $caps = array_diff($caps, [ $manage_name ]);
limita tutte le altre cap's di manage_options
? e permette solo di modificare le opzioni sulla privacy? 2. l'administrator
non avrebbe davvero bisogno di questo, dato che questa cap è già inclusa, o no?

@AndréKelling 1. L'hook map_meta_cap
funziona su base per-post. Nessun altro post ha la restrizione manage_privacy_options
quindi dovrebbe essere sicuro rimuoverlo. Maggiori informazioni qui.
2. Negli ambienti WordPress multisite solo i super-amministratori possono modificare la pagina della privacy policy. Come hai menzionato, questo non è rilevante per le installazioni single page.

@AndréKelling Hai altre domande riguardo la mia risposta? Altrimenti, accetta la risposta per segnare questa domanda come risolta :)

no scusa, non ho trovato il tempo di controllare. Lo faccio subito!

Funziona abbastanza bene, ma non sarebbe meglio verificare anche il ruolo dell'utente... questo influenzerebbe questa capacità per tutti gli utenti, no?

@GDY Ottimo punto. Ho dato per scontato che solo editori e amministratori possano modificare le pagine. Ho aggiunto il controllo del ruolo utente alla mia risposta.

In realtà la domanda si riferisce al ruolo di editor (che normalmente non può modificare la pagina della privacy nelle installazioni standard) quindi dovrebbe includere sia editor che amministratori.

Sì, ho aggiornato ancora una volta la mia risposta. Grazie per il tuo feedback!

Grazie mille per la soluzione. Per coloro che desiderano abilitare i Gestori del Negozio WooCommerce nella lista di chi può modificare la privacy, aggiungete "shop_manager" all'array_intersect nel secondo esempio.

So che add_action
è un alias di add_filter
, ma dato che il filtro map_meta_cap
è definito usando apply_filters
, penso che per brevità dovreste sostituire add_action()
con add_filter()

Questo codice causa un errore fatale (Fatal error: Uncaught TypeError: array_intersect(): Argument #2 must be of type array, null given ...snip... /wp-admin/user-new.php(195): edit_user()
) quando si crea un nuovo account utente. Sembra che l'utente possa essere null. Ho aggiunto una riga di controlli aggiuntiva dopo la chiamata get_userdata()
che la racchiude così: if ($user_meta && isset($user_meta->roles) && is_array($user_meta->roles)) { }

Grazie @Sven per la bella soluzione alternativa, funziona bene ma ho avuto un problema quando l'utente non è ancora loggato, l'azione map_meta_cap viene comunque attivata, il che ha causato un errore "502 bad gateway". Ho aggiunto un controllo is_user_logged_in()
prima in questo modo:
if (is_user_logged_in()){
add_action('map_meta_cap', 'custom_manage_privacy_options', 1, 4);
}
Forse è la mia configurazione del server (nginx) che causa questo bug, ma se qualcuno dovesse riscontrare lo stesso errore, ecco una soluzione.

La risposta fornita ha funzionato. Tuttavia, questa riga:
if (array_intersect(['editor', 'administrator'], $user_meta->roles)) {
Generava questo errore:
array_intersect(): Expected parameter 2 to be an array, null given in
Quindi ho modificato leggermente il codice per assicurarmi che entrambi i valori fossero array validi (codice completo):
add_action('map_meta_cap', 'custom_manage_privacy_options', 1, 4);
function custom_manage_privacy_options($caps, $cap, $user_id, $args) {
if ( !is_user_logged_in() ) return $caps;
$target_roles = array('editor', 'administrator');
$user_meta = get_userdata($user_id);
$user_roles = ( array ) $user_meta->roles;
if ( array_intersect($target_roles, $user_roles) ) {
if ('manage_privacy_options' === $cap) {
$manage_name = is_multisite() ? 'manage_network' : 'manage_options';
$caps = array_diff($caps, [ $manage_name ]);
}
}
return $caps;
}

Non vedo cosa hai cambiato. Se $user_meta->roles è null, stai ancora passando null a array_intersect qui.

Dato che stiamo prima verificando che l'utente sia loggato, $user_meta->roles non potrebbe mai essere null? Pensavo che il problema fosse dovuto all'uso diretto di $user_meta->roles in array_intersect, quindi l'ho salvato prima in una variabile. Non ricevo più messaggi di errore, quindi sembra che questo abbia risolto il problema.

⚠ Attenzione! Fino a quando questo bug non sarà risolto, questa risposta, sebbene concettualmente valida, non funzionerà! ⚠
Secondo me, ora è meglio farlo tramite wp-cli
.
Ad esempio, per estendere il ruolo di editor:
wp cap add editor manage_privacy_options
Oppure, solo per un utente specifico:
wp user add-cap USER_ID manage_privacy_options

Wow, a quanto pare non funziona :-( Se qualcuno può commentare, confermare... Sembra un bug.

Trovato il colpevole, bug piuttosto vecchio :-/
