Come modificare i permessi necessari per accedere alle opzioni di un plugin?
Ho i seguenti 3 ruoli diversi: Admin
, Editor
e SEO
. Ho installato WordPress SEO di Yoast e voglio ottenere questo:
- Non voglio che gli editori vedano le opzioni SEO, perché si limitano a scrivere post e non conoscono l'SEO. C'è una persona con il ruolo
SEO
che si occuperà dell'ottimizzazione. - Non voglio che la persona SEO veda le opzioni degli altri plugin. Voglio solo che abbia le stesse capacità degli Editor, ma con le funzioni SEO abilitate.
Ho provato con alcuni snippet trovati su questo sito e sono riuscito a nascondere la meta box agli Editor
, ma non la piccola 'scatola di valutazione' sopra il pulsante Pubblica.
Inoltre non so come gestire il secondo punto, perché tutti i plugin utilizzano la stessa capacità manage_options
, quindi non posso assegnare quella capacità al ruolo SEO
. E non so come cambiare la capacità necessaria senza modificare i file del plugin (cosa che verrebbe persa con l'aggiornamento del plugin).
Grazie in anticipo.

Forse questo non è il metodo migliore perché concede effettivamente all'editor l'accesso a Impostazioni e Opzioni, ma ciò che fa è concedere a un editor specifico (basato sull'ID utente) i permessi per modificare le opzioni. Successivamente verifichiamo se stiamo caricando uno dei template delle opzioni, se è così E l'ID utente corrisponde a quello a cui abbiamo concesso i permessi, interrompiamo il processo e mostriamo un messaggio.
1) Per prima cosa, crea il tuo utente SEO e assegnagli il ruolo di Editor.
2) Successivamente dobbiamo dare a questo utente la capacità di manage_options
. Puoi trovare questo parametro modificando l'utente e guardando l'URL, dovrebbe essere uno degli ultimi parametri nell'URL.
/** Concedi i permessi al nostro SEO **/
function give_seo_yoastToast() {
$user = new WP_User( $seo_user_id );
$user->add_cap( 'manage_options');
}
add_action( 'admin_init', 'give_seo_yoastToast');
3) Ora dobbiamo assicurarci che il nostro esperto SEO non possa accedere a nessuna delle opzioni critiche. Per quanto ne so, le pagine elencate di seguito sono l'unico modo in cui questo utente può modificare informazioni cruciali. SE tentano di visualizzare queste pagine, interrompiamo il processo e mostriamo un messaggio, sentiti libero di modificare il messaggio.
/** Rimuovi l'accesso a determinate pagine **/
add_action( 'load-options-general.php', 'prevent_seoguy_access' );
add_action( 'load-options-writing.php', 'prevent_seoguy_access' );
add_action( 'load-options-reading.php', 'prevent_seoguy_access' );
add_action( 'load-options-discussion.php', 'prevent_seoguy_access' );
add_action( 'load-options-media.php', 'prevent_seoguy_access' );
add_action( 'load-options-permalink.php', 'prevent_seoguy_access' );
add_action( 'load-options.php', 'prevent_seoguy_access' );
function prevent_seoguy_access(){
$currID = is_user_logged_in() ? get_current_user_id() : 0;
if($currID == $seo_user_id ){
wp_die("C'era un buco qui una volta, ora non c'è più.");
exit();
}
}
4) Al momento, può vedere le pagine nel menu ma quando tenta di accedervi vede il messaggio sopra. Come ulteriore passo, rimuoviamo effettivamente questa pagina dal nostro menu. Tieni presente che se rimuovi la pagina del menu senza la funzione sopra, un utente esperto potrebbe accedere a una qualsiasi delle pagine delle opzioni direttamente tramite URL.
/** Rimuovi la pagina Impostazioni dal menu per l'utente SEO **/
function seo_guy_menu() {
if(!current_user_can('administrator')){
remove_menu_page('options-general.php');
}
}
add_action('admin_menu', 'seo_guy_menu');
5) E hai finito!
Sfortunatamente, come hai sottolineato nella tua domanda, Yoast sembra non avere una capacità per concedere a un utente permessi specifici per tutte le funzioni SEO senza dargli anche permessi extra non necessari, il che è un peccato. E come nota a margine, invece di utilizzare un $seo_user_id
statico, potresti creare un Ruolo SEO, assegnare a quel ruolo i permessi di editor insieme a quelli sopra. È un po' più di lavoro (non troppo però), ma se hai un solo esperto SEO per sempre, allora il metodo sopra va bene.

Grazie per il punto 3. Non ne ho bisogno al momento ma potrebbe tornare utile in futuro. Sono riuscito a nascondere il 'rating box' con una funzione condizionale e CSS. È solo un problema visivo, quindi funziona.

Nota che WP_User->add_cap scriverà sul database, quindi crea solo un inutile sovraccarico avere questo hook su admin_init
in:
add_action( 'admin_init', 'give_seo_yoastToast');
Invece il Codex raccomanda di eseguirlo durante l'attivazione del tema/plugin. Ad esempio:
add_action("after_switch_theme", "your_add_cap_function");
e
add_action('switch_theme', 'your_remove_cap_function');
Oppure eseguirlo una volta e disabilitare il codice.

Il modo migliore per modificare il capability richiesto agli utenti per visualizzare le pagine delle impostazioni di Yoast SEO è utilizzare il filtro wpseo_manage_options_capability
.
Ecco un esempio di come utilizzarlo (da inserire nel file functions.php
):
/**
* Restituisce il capability necessario agli utenti per visualizzare le pagine delle impostazioni di Yoast SEO.
*
* @return mixed|void
*/
function my_custom_wpseo_manage_options_capability() {
$manage_options_cap = 'edit_others_posts';
return $manage_options_cap;
}
add_filter( 'wpseo_manage_options_capability', 'my_custom_wpseo_manage_options_capability' );
Nell'esempio sopra, viene utilizzato il capability edit_others_posts
in modo che (in un'installazione predefinita di WordPress) sia gli Editor che gli Amministratori possano accedere alle impostazioni di Yoast SEO.
Nel caso in cui non si desideri che gli Editor "normali" abbiano accesso, sarà necessario creare un nuovo ruolo (ad esempio 'SEO') che abbia le stesse capability di un Editor, più un'ulteriore capability personalizzata (ad esempio manage_wpseo_options
) che può essere utilizzata nella funzione sopra al posto di edit_others_posts
.
Il plugin Members di Justin Tadlock permette di creare facilmente nuovi ruoli e capability per questo scopo.
Nota: Questo potrebbe non funzionare su Multisite a causa di questo problema.
Aggiornamento: Nelle versioni Yoast SEO v5.5+, il filtro wpseo_manage_options_capability
è stato rinominato in wpseo_manage_options
.

Il tag @return viene utilizzato per documentare il valore di ritorno di funzioni o metodi quando si utilizza phpDocumentor. @return mixed|void
significa semplicemente che il valore restituito dalla funzione potrebbe essere di qualsiasi tipo, oppure void (cioè non restituisce alcun valore).

Ho appena trovato una soluzione molto semplice. Se non l'hai già fatto, installa un plugin per la gestione delle capability. Poi, crea una nuova capability dal gestore delle capability - chiamala "CUSTOM_CAPABILITY_NAME" o come preferisci. Quindi assegnarla a un ruolo o utente specifico.
Importante: copia e fai un backup di ogni file che intendi modificare nel caso in cui tu faccia un errore, così potrai sempre ripristinare l'originale.
Poi, sul server effettivo, devi spostarti nella directory wp-content/plugins/ e usare grep per trovare tutti i file che contengono 'manage_options'.
Esempio: grep 'manage_options' */*
La parte complicata è individuare la funzione principale che aggiunge il menu o il sottomenu alla dashboard. Ecco i miei due esempi per l'accesso specifico a Yoast SEO.
$manage_options_cap = apply_filters( 'wpseo_manage_options_capability', 'CUSTOM_CAPABILITY_NAME' );
add_submenu_page( 'wpseo_dashboard', __( 'Impostazioni WooCommerce SEO', 'yoast-woo-seo' ), __( 'WooCommerce SEO', 'yoast-woo-seo' ), 'CUSTOM_CAPABILITY_NAME', $this->short_name, array(
PS - non modificare nulla che inizi con '$' - è una variabile. :)
