Come permettere all'editor di modificare solo la pagina delle impostazioni sulla privacy?

8 nov 2018, 10:29:29
Visualizzazioni: 15K
Voti: 19

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.

2
Commenti

forse questo può essere d'aiuto? https://wordpress.org/support/topic/4-9-6-new-privacy-capability/

User User
8 nov 2018 12:07:49

@George, sì, ho visto anche quella pagina. non so cosa non vada nel mio codice. l'ho testato con due installazioni WP piuttosto semplici e pulite.

André Kelling André Kelling
8 nov 2018 12:29:30
Tutte le risposte alla domanda 4
12
26

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 editor e administrator che possono modificare le pagine (sia in istanze singole che multisito) di modificare ed eliminare la pagina della privacy policy, è necessario sovrascrivere l'array $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;
}
16 gen 2019 19:00:37
Commenti

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 André Kelling
17 gen 2019 11:00:54

@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.

Sven Sven
17 gen 2019 14:42:36

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

Sven Sven
4 mar 2019 15:01:43

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

André Kelling André Kelling
4 mar 2019 16:16:04

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

GDY GDY
12 dic 2019 09:42:12

@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.

Sven Sven
12 dic 2019 12:06:47

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.

GDY GDY
12 dic 2019 16:25:27

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

Sven Sven
12 dic 2019 17:26:41

fantastico! grazie.

Fatih Toprak Fatih Toprak
17 lug 2020 01:35:28

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.

Andrew Andrew
24 nov 2020 01:07:13

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()

Cornel Raiu Cornel Raiu
2 set 2022 03:16:20

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)) { }

rtpHarry rtpHarry
15 feb 2024 18:15:08
Mostra i restanti 7 commenti
0

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.

2 mar 2020 17:15:33
3

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;
}
21 apr 2021 07:35:35
Commenti

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

Rup Rup
21 apr 2021 12:35:08

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.

Preguntón Preguntón
21 apr 2021 13:51:05

Fare il cast di $user_meta->roles come array non è sicuramente il modo migliore. Basta verificare se $user_meta è impostato.

Gavin Gavin
9 lug 2021 14:12:57
2

⚠ 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
3 ago 2024 11:22:42
Commenti

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

sphakka sphakka
22 ago 2024 15:00:32

Trovato il colpevole, bug piuttosto vecchio :-/

sphakka sphakka
22 ago 2024 15:06:54